xPath 与 lxml
一、XPath 概览
- xpath 是一门在xml 文档中查找信息的语言。xpath 用于在xml 文档中通过元素和属性进行导航
提供了简洁明了的路径选择表达器。几乎所有我们想要定位的节点,都可以用xpath
二、xpath常用规则
常用的路径表达式
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选择属性 |
路径表达式 | 结果 |
---|---|
bookstore | 选取bookstore 元素的所有子节点 |
/bookstore | 选取根元素 bookstore。 注:假如路径起始于正斜杠(/),则路径代表到某元素的绝对路径 |
bookstore/book | 选取属于 bookstore 的子元素所有 book 元素 |
//book | 选取所有 book 子元素,而不管他们在文档中的位置 |
bookstore//book | 选择属于bookstore 元素后代的所有 book 元素,而不管他位于bookstore哪里 |
//@lang | 选取名为 lang 的属性 |
三、lxml 安装
安装
pip install lxml
实例:
from lxml import etree
text ='''
<div>
<ul>
<li class="item-0"><a href="#">first item</a></li>
<li class="item-1"><a href="#">second item</a></li>
<li class="item-2"><a href="#">third item</a></li>
</ul>
</div>
'''
html = etree.HTML(text)
result = etree.tostring(html)
四、所有节点
from lxml import etree
html = etree.parse('demo.html',etree.HTMLParsesr())
#这里的*代表所有节点,也是整个HTML文本中的所有元素节点都会被捕获,返回的是一个list
result = html.xpath('//*')
print(result)
五、子节点
我们通过 / 或 // 即可查找元素的子节点或子孙节点
from lxml import etree
html = etree.parse('demo.html',etree.HTMLParsesr())
result = html.xpath('//li/a')
print(result)
六、父节点
用 .. 来实现
from lxml import etree
html = etree.parse('demo.html',etree.HTMLParsesr())
result = html.xpath('//a[@href="demo.html"]/../@class')
print(result)
或者 parent::
from lxml import etree
html = etree.parse('demo.html',etree.HTMLParsesr())
result = html.xpath('//a[@href="demo.html"]/parent::*/@class')
print(result)
七、文本获取
text() 方法获取节点中的文本
from lxml import etree
html = etree.parse('demo.html',etree.HTMLParsesr())
result = html.xpath('//li[@class="item-0"]/text()')
print(result)
八、属性获取
@ 符号获取
from lxml import etree
html = etree.parse('demo.html',etree.HTMLParsesr())
result = html.xpath('//li/a@href')
print(result)