[Python] - 爬虫之lxml库的用法

lxml 用法源自 lxml python 官方文档,更多内容请直接参阅官方文档

lxml 官方文档


HTML 示例代码

text = '''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
     </ul>
 </div>
'''

小试牛刀

使用 lxmletree 库,将其打印出来
# 导入 lxml etree 库
from lxml import etree

# 获取 html 内容 元素
htmlEmt = etree.HTML(text)
# 将内容元素转换为字符串
result = etree.tostring(htmlEmt)
# utf-8 格式输出
print(result.decode("utf-8"))

打印结果为:

<html><body><div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
 </div></body></html>

lxml 有自动修正 HTML 代码的功能


文件读取

利用 parse 方法来读取文件

文件名:text.xml
内容:

<div>
    <ul>
        <li class="item-0"><a href="link1.html">first item</a></li>
        <li class="item-1"><a href="link2.html">second item</a></li>
        <li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
        <li class="item-1"><a href="link4.html">fourth item</a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
from lxml import etree
# text.xml 是一个 xml 文件,并在当前文件同目录下
htmlEmt = etree.parse('text.xml')

# pretty_print: 优化输出
result = etree.tostring(htmlEmt, pretty_print=True)
# 输出
print(result)

同样可以得到相同的结果


XPath实例测试

以上一段 text.xml 文件为例

获取所有的 <li> 标签
from lxml import etree

# 获取文件元素
htmlEmt = etree.parse('text.xml')
# 获取所有的 <li> 标签 
result = htmlEmt.xpath('//li')
print(result)
# 获取标签数量
print(len(result))
# 取出第一个 li 标签
print(result[0])

输出结果:

[<Element li at 0x1023fc0c8>, <Element li at 0x1023fc108>, <Element li at 0x1023fc148>, <Element li at 0x1023fc188>, <Element li at 0x1023fc1c8>]
5
<Element li at 0x1023fc0c8>

获取 <li> 标签的所有 class
result = htmlEmt.xpath('//li/@class')
print(result)

输出结果:

['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']

获取 <li> 标签下 hreflink1.html<a> 标签
result = htmlEmt.xpath('//li/a[@href="link1.html"]')
print(result)
print(result[0].text)

输出结果:

[<Element a at 0x1023fc208>]
first item

获取 <li> 标签下的所有 <span> 标签

因为 / 是用来获取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用双斜杠

result = html.xpath('//li//span')
print(result)
print(result[0].text)

输出结果:

[<Element span at 0x1023fc0c8>]
third item

获取 <li> 标签下的所有 class,不包括 <li> 标签的 class
result = html.xpath('//li/a//@class')
print(result)

输出结果:

['bold']

获取最后一个 <li><a>href
result = html.xpath('//li[last()]/a/@href')
print(result)

输出结果:

['link5.html']

获取倒数第二个元素的内容
result = html.xpath('//li[last()-1]/a')
print(result[0].text)

输出结果:

fourth item

获取 classbold 的标签名
result = html.xpath('//*[@class="bold"]')
print(result[0].tag)
print(result[0].text)

输出结果:

span
third item
  • 10
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值