XPATH
在拿到页面源代码之后,用 etree.HTML()
或 etree.XML()
进行解析,或者用 etree.parse()
对文件进行解析。前两个接受 str
类型参数,代表页面源代码,最后一个接受 str
类型参数,代表文件路径。以上三个方法均返回 ElementTree
对象。
对于 ElementTree
对象,可以使用 xpath()
方法进行解析。该方法接受 str
类型参数,代表 xpath
的路径信息,返回的同样是 ElementTree
对象。
xpath
路径规则如下:
- 用
/
表示父子关系。"/book/name"
表示标签 book 下的子标签 name - 用
//
表示任意的路径。/book/author//nick
表示标签 author 下的所有 nick 节点。返回的是一个列表。 - 用
text()
来获取标签内的文本信息(这和bs4
中的Tag
类型中的text
数据有本质区别,后者返回的是该标签下的————包括后代子孙标签中的所有————文本内容),并且其在路径中的形式如同父子关系一般,例如:/book/name/text()
。以列表形式返回数据,所以注意,如果有多个符合条件的标签,都会被放到列表中。 - * 用来表示任意节点。
/book/author/*/nick
就表示 author 标签的任意子标签的 nick 子标签。 - 如果一个标签下有多个相同名称的标签,可以通过序号来区别,出现越早的序号越小,从 1 开始而非从 0 开始。或者可以用属性来区别,语法如例:
/html/body/ul/li[1]/a/text()
和/html/body/ol/li/a[@href='dapao']
- . 用于非开头位置的
ElementTree
类型,表示当前的节点。例如,我们已经找到了某个 li 标签,li.xpath("./a/text()")
表示找该 li 标签的子 a 标签里的文本内容。 - 如果要获取属性值,则语法为:
./a/@href
,同样是作为父子关系出现,@ 表示属性。
实例代码如下:
1 | from lxml import etree |
1 | from lxml import etree |
1 | import requests |