【小沐学Python】网络爬虫之lxml

news/2024/7/19 10:16:37 标签: python, 爬虫, 开发语言, lxml, 网络爬虫

文章目录

  • 1、简介
  • 2、安装
  • 3、基本功能
    • 3.1 lxml.etree
    • 3.2 解析HTML网页
    • 3.3 读取并解析HTML文件
    • 3.4 提取所有a标签内的文本信息
    • 3.5 树迭代
    • 3.6 序列化
    • 3.7 元素以字典的形式携带属性
    • 3.8 元素包含文本
  • 4、代码测试
    • 4.1 lxml解析网页
    • 4.2 使用xpath获取所有的文本
    • 4.3 使用xpath获取 class 为 "item-1" 的段落文本
  • 结语

1、简介

https://lxml.de/

LXML是功能最丰富的 和易于使用的库 用于处理 XML 和 HTML 在 Python 语言中。

lxml XML 工具包是 C 库 libxml2 和 libxslt 的 Pythonic 绑定。它的独特之处在于它结合了速度和 这些库的 XML 功能完整性与 原生 Python API,大部分兼容,但优于众所周知的 ElementTree API。最新版本适用于所有 CPython 版本 从 2.7 增加到 3.9有关以下内容的更多信息,请参阅简介 LXML项目的背景和目标。
在这里插入图片描述

2、安装

https://github.com/lxml/lxml
在这里插入图片描述

下载源码:

git clone https://github.com/lxml/lxml.git lxml

或者安装库:

pip install lxml
#pip install lxml==3.4.2

3、基本功能

lxmletree_23">3.1 lxml.etree

python">import requests
from lxml import etree
 
res = requests.get("http://www.jsons.cn/zt/")
html = res.text
root_element = etree.HTML(html)
 
print(root_element)
print(root_element.tag)

3.2 解析HTML网页

python">#解析HTML字符串
from lxml import etree
text = '''
<html><body>
    <div class="key">
        <div class="name">无羡</div>
        <div class="age">20</div>
        <div class="address">四川</div>
    </div>
</body></html>
'''
# 开始初始化
html = etree.HTML(text)  # 这里需要传入一个html形式的字符串
print(html)
print(type)
# 将字符串序列化为html字符串
result = etree.tostring(html).decode('utf-8')
print(result)
print(type(result))

3.3 读取并解析HTML文件

python">from lxml import etree
 
# 将html文件进行读取
html = etree.parse('1.html')
 
# 将html内容序列化
result = etree.tostring(html).decode('utf-8')
print(result)
print(type(result))
html = etree.HTML(result)  # 这里需要传入一个html形式的字符串
print(html)
print(type)

3.4 提取所有a标签内的文本信息

python">from lxml import etree
# 创建解析对象
parse_html=etree.HTML(html)
# 书写xpath表达式,提取文本最终使用text()
xpath_bds='//a/text()'
# 提取文本数据,以列表形式输出
r_list=parse_html.xpath(xpath_bds)
# 打印数据列表
print(r_list)

3.5 树迭代

以递归方式遍历树,并用它的元素做一些事情。

python">>>> root = etree.Element("root")
>>> etree.SubElement(root, "child").text = "Child 1"
>>> etree.SubElement(root, "child").text = "Child 2"
>>> etree.SubElement(root, "another").text = "Child 3"

>>> print(etree.tostring(root, pretty_print=True))
<root>
  <child>Child 1</child>
  <child>Child 2</child>
  <another>Child 3</another>
</root>

>>> for element in root.iter():
...     print("%s - %s" % (element.tag, element.text))
root - None
child - Child 1
child - Child 2
another - Child 3

>>> for element in root.iter("child"):
...     print("%s - %s" % (element.tag, element.text))
child - Child 1
child - Child 2

>>> for element in root.iter("another", "child"):
...     print("%s - %s" % (element.tag, element.text))
child - Child 1
child - Child 2
another - Child 3

3.6 序列化

python">>>> root = etree.XML('<root><a><b/></a></root>')

>>> etree.tostring(root)
b'<root><a><b/></a></root>'

>>> print(etree.tostring(root, xml_declaration=True))
<?xml version='1.0' encoding='ASCII'?>
<root><a><b/></a></root>

>>> print(etree.tostring(root, encoding='iso-8859-1'))
<?xml version='1.0' encoding='iso-8859-1'?>
<root><a><b/></a></root>

>>> print(etree.tostring(root, pretty_print=True))
<root>
  <a>
    <b/>
  </a>
</root>

3.7 元素以字典的形式携带属性

python">>>> root = etree.Element("root", interesting="totally")
>>> etree.tostring(root)
b'<root interesting="totally"/>'

>>> print(root.get("interesting"))
totally

>>> print(root.get("hello"))
None
>>> root.set("hello", "Huhu")
>>> print(root.get("hello"))
Huhu

>>> etree.tostring(root)
b'<root interesting="totally" hello="Huhu"/>'

>>> sorted(root.keys())
['hello', 'interesting']

>>> for name, value in sorted(root.items()):
...     print('%s = %r' % (name, value))
hello = 'Huhu'
interesting = 'totally'

>>> attributes = root.attrib

>>> print(attributes["interesting"])
totally
>>> print(attributes.get("no-such-attribute"))
None

>>> attributes["hello"] = "Guten Tag"
>>> print(attributes["hello"])
Guten Tag
>>> print(root.get("hello"))
Guten Tag

>>> d = dict(root.attrib)
>>> sorted(d.items())
[('hello', 'Guten Tag'), ('interesting', 'totally')]

3.8 元素包含文本

python">>>> root = etree.Element("root")
>>> root.text = "TEXT"

>>> print(root.text)
TEXT

>>> etree.tostring(root)
b'<root>TEXT</root>'

4、代码测试

lxml_206">4.1 lxml解析网页

使用xpath获取所有段落的文本

python"># -*- coding: UTF-8 -*-
from lxml import etree

def fetch_text(html):
    html = etree.HTML(html)
    result = html.xpath("//p/text()")
    return result
    
if __name__ == '__main__':
    html = '''
        <html>
            <head>
                <title>这是一个简单的测试页面</title>
            </head>
            <body>
                <p class="item-0">body 元素的内容会显示在浏览器中。</p>
                <p class="item-1">title 元素的内容会显示在浏览器的标题栏中。</p>
            </body>
        </html>
        '''
    imgs = fetch_text(html)
    print(imgs)

4.2 使用xpath获取所有的文本

python">
# -*- coding: UTF-8 -*-
from lxml import etree

def fetch_text(html):
    html = etree.HTML(html)
    result = html.xpath("//text()")
    return result
    
if __name__ == '__main__':
    html = '''
        <html>
            <head>
                <title>这是一个简单的测试页面</title>
            </head>
            <body>
                <p>body 元素的内容会显示在浏览器中。</p>
                <p>title 元素的内容会显示在浏览器的标题栏中。</p>
            </body>
        </html>
        '''
    imgs = fetch_text(html)
    print(imgs)

4.3 使用xpath获取 class 为 “item-1” 的段落文本

python"># -*- coding: UTF-8 -*-
from lxml import etree

def fetch_text(html):
    html = etree.HTML(html)
    result = html.xpath("//p[@class='item-1']/text()")
    return result

if __name__ == '__main__':
    html = '''
        <html>
            <head>
                <title>这是一个简单的测试页面</title>
            </head>
            <body>
                <p class="item-0">body 元素的内容会显示在浏览器中。</p>
                <p class="item-1">title 元素的内容会显示在浏览器的标题栏中。</p>
            </body>
        </html>
        '''
    imgs = fetch_text(html)
    print(imgs)

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!


http://www.niftyadmin.cn/n/5234810.html

相关文章

2.Ansible的copy模块,我最常用的模块

1. 简述 先从我自身的情况来说&#xff0c;我不是运维人员&#xff0c;并且对linux操作也不是特别熟悉&#xff0c;所以工作中我使用ansible基本就是在平常的自动化部署中&#xff0c;而使用最多的模块就是copy模块。我使用copy模块也主要是来替换生产环境的配置文件。所以&am…

【C/C++笔试练习】this指针的概念、初始化列表、const对象调用、构造和析构函数、继承和组合、重载和多态、虚函数的定义、计算日期到天数转换、幸运的袋子

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;this指针的概念&#xff08;2&#xff09;初始化列表&#xff08;3&#xff09;const对象调用&#xff08;4&#xff09;构造和析构函数&#xff08;5&#xff09;继承和组合&#xff08;6&#xff09;重载和多态&#x…

【Redis】Redis缓存使用问题

目录 Redis缓存使用问题 数据一致性 新增数据类 更新缓存类 1、先更新缓存,再更新DB 2、先更新DB,再更新缓存 删除缓存类 3、先删除缓存,后更新DB 4、先更新DB,后删除缓存 如何选择问题 缓存穿透、击穿、雪崩 缓存穿透 缓存击穿 使用互斥锁(mutex key) 永远…

华为OD机试真题-虚拟游戏理财-2023年OD统一考试(C卷)

题目描述: 在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。现有一家Bank,它提供有若干理财产品m,风险及投资回报不同,你有N(元)进行投资,能接受的总风险值为X。 你要在可接受范围内选择最优的投资方式获得最大回报。 说明: 在虚拟游戏中…

Ubuntu18.04的VSCode输入不了中文

在Ubuntu使用VSCode写代码想写注释的&#xff0c;但是发现不能输入中文&#xff0c;上网寻找解决方案&#xff0c;这个方法也是可以的&#xff08;根据2的命令操作就可以了&#xff0c;2也使参考1的&#xff09;&#xff1a; Visual Studio Code on Linux-Debian and Ubuntu b…

LeetCode 1094. 拼车:优先队列

【LetMeFly】1094.拼车&#xff1a;优先队列 力扣题目链接&#xff1a;https://leetcode.cn/problems/car-pooling/ 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组…

react-native实践日记--5.ReactNative 项目版本升级,0.61到0.72升级的问题记录(一)

ReactNative的版本迭代太频繁&#xff0c;官方说的是React Native原则上每月发布一个新版本&#xff0c;且目前基本是向前不兼容的&#xff0c;导致项目升级很困难&#xff0c;各种依赖插件问题多多&#xff0c;下面是记录的升级中遇到的主要几个印象深刻的问题。 升级&#x…

右值引用和移动语句(C++11)

左值引用和右值引用 回顾引用 我们之前就了解到了左值引用&#xff0c;首先我们要了解引用在编译器底层其实就是指针。具体来说&#xff0c;当声明引用时&#xff0c;编译器会在底层生成一个指针来表示引用&#xff0c;但在代码编写和使用时&#xff0c;我们可以像使用变量类…