第三章 网页数据的解析提取之XPath

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::*')
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容