XPath语法的使用

XPath语法的使用

XPath简介

  • XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
  • XPath 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等。

    XPath术语

  • 在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

XPath语法

选取节点

  • XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:
表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

选取未知节点

  • XPath 通配符可用来选取未知的 XML 元素(节点):
通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

我的实例

  • 空气质量排名爬虫

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    import re
    import requests
    from lxml import etree

    def show():
    print('全国空气状况排名表(污染)'+'\n统计时间:'+time)
    print()
    for num in range(len(rank)):
    print('第'+rank[num]+'名 '+provinces[num]+'———'+citys[num]+' 空气质量:'+qualitys[num]+' AQI:'+AQI[num]+' PM2.5:'+PM2_5[num]+'μg/m³')
    print('\n全国空气状况排名表(污染)'+'\n统计时间:'+time)

    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",}
    url = 'http://www.pm25.com/rank.html'
    response = requests.get(url, headers=headers)
    response.encoding = 'utf-8'
    html = response.content.decode('utf-8')
    root = etree.HTML(html)
    time = re.findall(r'<span>统计时间:(.*?)</span>', html)[0]
    rank = root.xpath('//ul[@class="pj_area_data_details rrank_box"]//span[@class="pjadt_ranknum"]/text()')
    provinces = root.xpath('//ul[@class="pj_area_data_details rrank_box"]//span[@class="pjadt_sheng"]/text()')
    citys = root.xpath('//ul[@class="pj_area_data_details rrank_box"]//a/text()')
    qualitys = root.xpath('//ul[@class="pj_area_data_details rrank_box"]//span[@class="pjadt_quality"]//em/text()')
    AQI = root.xpath('//ul[@class="pj_area_data_details rrank_box"]//span[@class="pjadt_aqi"]/text()')
    PM2_5 = root.xpath('//ul[@class="pj_area_data_details rrank_box"]//span[@class="pjadt_pm25"]/text()')

    if __name__ == "__main__":
    show()
  • 更多详细XPath的使用可以参考XPath教程

作者

TIANYUZHOU

发布于

2020-03-15

更新于

2021-02-17

许可协议

评论