XPath的使用
- xpath全称XML Path Language,用来在XML文档里面查找信息,同样适用于HTML文档的搜索。
- 常用规则
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
//title[@lang='eng']
代表选择所有名称为title的同时属性lang的值为eng的节点
- XPath的基本用法和关于轴的使用
from lxml import etree
text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html"><span>first item</span></a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link3.html">fourth item</a></li>
<li class="item=0"><a href="link4.html">fifth item</a>
</ul>
</div>
'''
# 调用etree的HTML类进行初始化,生成一个xpath对象
html = etree.HTML(text)
# 视同tostring()方法将HTML补充完整
result = etree.tostring(html)
print(result.decode('utf-8'))
print("---------------------------")
html = etree.parse('./text.html', etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))
print("-------------使用轴--------------")
html = etree.HTML(text)
# ancestor: 获取所有祖先节点 (获取第一个<li>标签的所有祖先节点)
result = html.xpath('//li[1]/ancestor::*')
# 获取所有标签为div的祖先节点 (获取第一个<li>标签的所有标签为div的祖先节点)
result = html.xpath('//li[1]/ancestor::div')
# attribute: 获取所有属性值 (获取第一个<li>标签的所有属性)
result = html.xpath('//li[1]/attribute::*')
# child: 获取所有直接子节点 (获取第一个<li>标签的所有直接子节点,条件是a标签且属性href="link.html")
result = html.xpath('//li[1]/child::a[@href="link.html"]')
# descendant: 获取所有子孙节点 (获取第一个<li>标签的所有子孙节点中标签为<span>的)
result = html.xpath('//li[1]/descendant::span')
# following: 获取当前节点之后的所有节点 (获取第一个<li>标签后的第二个后续节点)
result = html.xpath('//li[1]/following::*[2]')
# following-sibling: 获取当前节点之后的所有同级节点 (获取第一个<li>标签之后的所有同级节点)
result = html.xpath('//li[1]/following-sibling::*')