学科分类
目录
网络爬虫

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
点击此处
隐藏目录