参考来源
lxml用法源自 lxml python 官方文档,更多内容请直接参阅官方文档,本文对其进行翻译与整理。
lxml
http://lxml.de/index.html
XPath语法参考 w3school
w3school
http://www.w3school.com.cn/xpath/index.asp
安装
pip install lxml
利用 pip 安装即可
XPath语法
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。
节点关系
(1)父(Parent)
每个元素以及属性都有一个父。
在下面的例子中,book 元素是 title、author、year 以及 price 元素的父:
Harry PotterJ K. Rowling
2005
29.99
(2)子(Children)
元素节点可有零个、一个或多个子。
在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:
Harry PotterJ K. Rowling
2005
29.99
(3)同胞(Sibling)
拥有相同的父的节点
在下面的例子中,title、author、year 以及 price 元素都是同胞:
Harry PotterJ K. Rowling
2005
29.99
(4)先辈(Ancestor)
某节点的父、父的父,等等。
在下面的例子中,title 元素的先辈是 book 元素和 bookstore 元素:
Harry PotterJ K. Rowling
2005
29.99
(5)后代(Descendant)
某个节点的子,子的子,等等。
在下面的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素:
Harry PotterJ K. Rowling
2005
29.99
选取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
下面列出了最有用的路径表达式:
实例
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
实例
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
XPath 运算符
下面列出了可用在 XPath 表达式中的运算符:
lxml用法
初步使用
首先我们利用它来解析 HTML 代码,先来一个小例子来感受一下它的基本用法。
from lxml import etree
text = '''
'''
html = etree.HTML(text)
result = etree.tostring(html)
print(result)
首先我们使用 lxml 的 etree 库,然后利用 etree.HTML 初始化,然后我们将其打印出来。
其中,这里体现了 lxml 的一个非常实用的功能就是自动修正 html 代码,大家应该注意到了,最后一个 li 标签,其实我把尾标签删掉了,是不闭合的。不过,lxml 因为继承了 libxml2 的特性,具有自动修正 HTML 代码的功能。
所以输出结果是这样的
不仅补全了 li 标签,还添加了 body,html 标签。
文件读取
除了直接读取字符串,还支持从文件读取内容。比如我们新建一个文件叫做 hello.html,内容为
利用 parse 方法来读取文件。
from lxml import etree
html = etree.parse('hello.html')
result = etree.tostring(html, pretty_print=True)
print(result)
同样可以得到相同的结果。
XPath实例测试
依然以上一段程序为例
(1)获取所有的
标签from lxml import etree
html = etree.parse('hello.html')
print type(html)
result = html.xpath('//li')
print result
print len(result)
print type(result)
print type(result[0])
运行结果
[, , , , ]
5
可见,etree.parse 的类型是 ElementTree,通过调用 xpath 以后,得到了一个列表,包含了 5 个
元素,每个元素都是 Element 类型(2)获取
标签的所有 classresult = html.xpath('//li/@class')
print result
运行结果
['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
(3)获取
标签下 href 为 link1.html 的 标签result = html.xpath('//li/a[@href="link1.html"]')
print result
运行结果
['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
(4)获取
标签下的所有 标签注意这么写是不对的
[]
因为 / 是用来获取子元素的,而 并不是 的子元素,所以,要用双斜杠
result = html.xpath('//li/span')
运行结果
[]
(5)获取
标签下的所有 class,不包括result = html.xpath('//li/a//@class')
print result
运行结果
['blod']
(6)获取最后一个
的