Python lxml模块中使用XPath语句
Contents
lxml模块 有很多种功能,不单只有 XPath 的方式解析 xml文档。
XPath
XPath 为 XML 路径语言(XML Path Language),它是一种用来确定 xml文档中某部分位置的语言。在前端代码中常使用。
XPath语法
XPath 选择节点的方式有点类似于Linux下选择路径的方式。
| 表达式 | 描述 | 
|---|---|
| nodename | 选取此节点的所有子节点。 | 
| / | 从根节点选取。 | 
| // | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 | 
| . | 选取当前节点。 | 
| .. | 选取当前节点的父节点。 | 
| @ | 选取属性。 | 
例如下面的xml文档:
 |  | 
| 路径表达式 | 结果 | 
|---|---|
| bookstore | 选取 bookstore 元素的所有子节点。 | 
| /bookstore | 选取根元素 bookstore。假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! | 
| bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素。 | 
| //book | 选取所有 book 子元素,而不管它们在文档中的位置。 | 
| bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 | 
| //@lang | 选取名为 lang 的所有属性。 | 
以上路径表达式所选取的都为目标节点下的所有子节点,如果想要得到特定位置的子节点,需要使用 [] 进行选取。选取的方式有以下几种。
| 路径表达式 | 结果 | 
|---|---|
| /bookstore/book[1] | 按照索引号进行选取,第一个索引为1。选取属于 bookstore 子元素的第一个 book 元素。 | 
| /bookstore/book[last()] | 使用函数。选取属于 bookstore 子元素的最后一个 book 元素。 | 
| /bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 | 
| /bookstore/book[position() < 3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 | 
XPath在lxml模块中使用
lxml模块 是一款高性能的 Python XML库,它构建在两个C库之上: libxml2 和 libxslt。它们为执行解析、序列化和转换等核心任务提供了主要动力。
lxml解析html
lxml模块 解析html文档的方式有三种:etree.fromstring、etree.HTML、etree.parse。前两种的处理的方式是一样的,输入都为字符串类型,输出都为 根节点的Element对象。etree.parse 方式输入为文件类型的对象,如文件的名称或路径、文件对象、类文件对象、使用URL路径,输出为 ElementTree对象。
 |  | 
Element对象
lxml模块 将 html文档 中的tag节点都当作了 Element对象 处理。Element对象 中现在只关注它的几个属性,以及 xpath方法 。
| 属性 | 说明 | 
|---|---|
| attrib | Element对象中的属性字典,可以使用get(), set(), keys(), values() 和 items() 函数来存取属性。 | 
| base | Element对象的基础URI,如果使用parse,会显示为文档的路径,如果URI不知道的话,会设置成None。 | 
| nsmap | Namespcae prefix,所有的父节点的命名空间声明字典。 | 
| prefix | 命名空间前缀。 | 
| sourceline | Element对象在解析时在原文档中的行位置,不知道时为None。 | 
| tag | Element对象的tag名称。 | 
| tail | 与下一个Element对象之间的字符串,如果下一个Element对象不存在,则为None。 | 
| text | 与第一个子节点之间的字符串变量。 | 
xpath()方法 的作用是按照xpath语法找到对应的 Element对象 列表,后续的操作都在这个列表中展开。
 |  | 
在使用 xpath方法 时,xpath语句的作用对象为整个的文档,并不是以当前的 Element对象 为root节点!如果要以当前的 Element对象 为root节点,需要使用 . 语句。
 |  | 
其他的 XPath语法 使用方式一样。
xpath选择兄弟节点
 |  | 
例如上面的例子,想要获取制片国家和语言的信息,但这部分信息不在 span 标签中,而是处于 span和br 之间。
首先,我们找到 制片国家/地区 这个节点
 |  | 
国家对应的属性为 text(),并且是在tag后面的属性。xpath中,对于相邻属性,有 following、following-sibling、preceding、preceding-sibling 四种方式获取。对于上面的例子来说,可以使用 following、following-sibling。
 |  | 
following 方式获取的是后继所有 tag 中的 text()。而 following-sibling 获取的是 同等级的兄弟节点的内容。
preceding、preceding-sibling 为前驱节点,用法和上面的一样。
另外,还有几个:
- parent:: - 取当前节点的 父节点。
 - child:: - 取当前节点的 子节点。
 - ancestor:: - 取当前节点的 父节点、祖父节点等。
 - descendant:: - 取当前节点的 子节点、子孙节点。