from lxml import etree
一、ElementPath 类
ElementTree 类中附带了一个类似于 XPath 路径语言的 ElementPath 类。
3个常用的方法,可以满足大部分搜索和查询需求,并且这3个方法的参数都是 XPath 语句。
返回匹配到的第一个子元素。
以列表的形式返回所有匹配的子元素。
返回一个所有匹配元素的迭代器。
从文档树的根节点开始,搜索符合要求的节点。
# 从字符串中解析 XML,返回根节点
root = etree.XML("<root><a x="123">aText</a></root>")
# 从根节点查找,返回匹配到的节点名称
print(root.find('a').tag)
# 从根节点开始查找,返回匹配到的第一个节点的名称
print(root.findall("./a[@x]")[0].tag)
还可以调用 xpath() 方法,使用元素作为上下文节点来评估 XPath 表达式。
二、lxml 库的使用
示例
<!-- hello.html -->
<div>
<ul>
<li class="item-0"><a href="1.html">first item</a></li>
<li class="item-1"><a href="2.html">second item</a></li>
<li class="item-inactive"><a href="3.html"><span class="bold">third item</span></a></li>
<li class="item-1"><a href="4.html">fourth item</a></li>
<li class="item-0"><a href="5.html">fifth item</a></li>
</ul>
</div>
使用 lxml 库中的路径表达式技巧,通过调用 xpath() 方法匹配选取的节点。
① 获取任意位置的 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]))
② 获取 <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)
③ 获取倒数第二个元素的内容
从任意位置开始选取倒数第二个 <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)