Python Xpath基础知识
一、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 = '''
<li class = "li li-first"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class,"li")]/a/text()')
print(result)
3.8 多属性匹配
from lxml import etree
text = '''
<li class = "li li-first" name="item"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')
print(result)

浙公网安备 33010602011771号