lxml库的基本使用
我们使用一个HTML示例文件做为素材来介绍lxml库的基本使用,该文件名为hello.html,内容如下:
<!-- hello.html -->
<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>
接下来,我们基于上述HTML文档,使用lxml库中的路径表达式技巧,通过调用xpath()方法匹配选取到的节点,具体如下:
1. 获取任意位置的li节点
可以直接使用“//”从任意位置选取节点li,路径表达式如下:
//li
通过lxml.etree模块的xpath方法,将hello.html文件中与该路径表达式匹配到的列表进行返回,并打印输出,具体代码如下。
from lxml import etree
html = etree.parse('hello.html')
# 查找所有的li节点
result = html.xpath('//li')
# 打印<li>标签的元素集合
print(result)
# 打印<li>标签的个数
print(len(result))
# 打印返回结果的类型
print(type(result))
# 打印第一个元素的类型
print(type(result[0]))
执行上述代码的输出结果如下:
[<Element li at 0x2cc9a48>, <Element li at 0x2cc99c8>, <Element li at
0x2cc9a88>, <Element li at 0x2cc9ac8>, <Element li at 0x2cc9b08>]
5
<class 'list'>
<class 'lxml.etree._Element'>
2. 继续获取< li>标签的class属性
在上个表达式的末尾,使用“/”向下选取节点,并使用“@”选取class属性节点,表达式如下:
//li/@class
获取< li>标签的class属性的示例代码如下:
from lxml import etree
html = etree.parse('hello.html')
# 查找位于li标签的class属性
result = html.xpath('//li/@class')
print(result)
程序运行的结果为:
['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
3. 获取倒数第二个元素的内容
从任意位置开始选取倒数第二个< li>标签,再向下选取标签< a>。如果要获取该标签中的文本,可以使用如下表达式:
//li[last()-1]/a
或者
//li[last()-1]/a]/text()
不同的是,第一个表达式需要访问text属性,才能拿到标签的文本,而第二个表达式可直接获取文本。使用第一个路径表达式的示例如下。
from lxml import etree
html = etree.parse('hello.html')
# 获取倒数第二个元素的内容
result = html.xpath('//li[last()-1]/a')
print(result[0].text)
程序输出的结果为:
fourth item