一、Xpath简介
XPath, 全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。它最初是用来搜寻 XML 文档的,但是它同样适用于 HTML 文档的搜索。。
XPath 于 1999 年 l l 月 16 日成为 W3C标准,它被设计为供 XSLT、 XPointer 以及其他 XML解析 软件使用,更多的文档可以访问其官方网站: https://www.w3.org/TR/xpath/。
二、Xpath常用规则
表达式
描述
nodename
选取此节点的所有子节点
/
从当前节点选取直接子节点
//
从当前节点选取子孙节点
.
选取当前节点
..
选取当前节点的父节点
@
选取属性
*
所有节点
常用的模块
lxml库的etree模块
常用的方法
tostring():可输出修正后的HTML代码
decode():转换代码类型
三、节点选取例子
3.1 所有节点
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//*')
print(result)
一般会用//开头的Xpath规则来选取所有符号要求的节点。
3.2 子节点
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li/a')
print(result)
我们通过/或//即可查找元素的子节点或子孙节点。假如现在想选择 li 节点的所有直接 a 子节点, 可以这样实现。
3.3 父节点
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//a@[href="link4.html"]/../@class')
print(result)
比如,现在首先选中 href 属性为 link4.html 的 a 节点,然后再获取其父节点,然后再获取其 class 属性。
3.4 属性匹配
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]')
print(result)
比如,这里如果要选取 class 为 item-1 的 li 节点。
3.5 文本获取
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]//text()')
print(result)
用 XPath 中的 text()方法获取节点中的文本。
3.6 属性获取
例如,我们想获取所有 li 节点下所有 a 节点的 href 属性,代码如下:
from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li/a/@href')
print(result)
3.7 属性多值匹配
from lxml import etree
text = '''
first item'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class,"li")]/a/text()')
print(result)
3.8 多属性匹配
from lxml import etree
text = '''
first item'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')
print(result)