Python爬虫经常使用:XPath语言

 XPath (XML Path Language),即 XML 路径语言,它是一门在 XML文档中查找信息的语言,也适用于HTML 文档的搜索。html

------------ 简注 --------------------------------------------ide

  XML 指可扩展标记语言,被设计用来传输和存储数据。函数

  HTML 指超文本标记语言,被设计用来显示数据(描述网页)。spa

---------------------------------------------------------------设计


  XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。3d

------------ 简注 --------------------------------------------htm

在 XPath 中,有七种类型的节点:元素、属性、文本、blog

命名空间、处理指令、注释以及文档(根)节点。教程

XML 文档是被做为节点树来对待的。图片

树的根被称为文档节点或者根节点。

---------------------------------------------------------------


  XPath 包含一个标准函数库,这些函数用于字符串、数值、时间的匹配以及节点、序列的处理等。

1、XPath 经常使用表达式

图片

2、XPath 经常使用函数

position() 返回当前正在被处理节点的 index 位置。

last() 返回当前被处理节点列表中的项目数目。

图片


用法示例

示例文档

图片


1) 选取全部节点

a. 从当前节点 (根节点) 选取全部子孙节点与元素名

demo1 = html.xpath('//*')
print(demo1)
# 运行结果:
'''[<Element html at 0x1a3caa23688>, 

<Element body at 0x1a3caa23808>,
<Element bookstore at 0x1a3caa237c8>, 

<Element book at 0x1a3caa23848>,
<Element title at 0x1a3caa23888>, 

<Element price at 0x1a3caa23908>,
<Element book at 0x1a3caa23948>, 

<Element title at 0x1a3caa23988>,
<Element price at 0x1a3caa23c08>]'''

b. 选取全部元素名为 book 的子节点,无需考虑位置

demo2 = html.xpath('//book')
print(demo2)
# 运行结果:
'''[<Element book at 0x204fc5a3808>, 

<Element book at 0x204fc5a37c8>]'''


2) 选取子节点

a. 选取 book 节点下的全部子节点

demo3 = html.xpath('//book/*')
print(demo3)
# 运行结果:
'''[<Element title at 0x1c6e5eb3848>,
<Element price at 0x1c6e5eb3808>,
<Element title at 0x1c6e5eb3888>,
<Element price at 0x1c6e5eb38c8>]'''

b. 选取 book 节点的 title 子节点

demo4 = html.xpath('//book/title')
print(demo4)
# 运行结果:
'''[<Element title at 0x200f3443848>, 

<Element title at 0x200f3443808>]'''


3) 选取父节点

选取 title 节点的父节点

demo5 = html.xpath('//title/..')
print(demo5)
# 运行结果:
'''[<Element book at 0x26b22553848>, 

<Element book at 0x26b22553808>]'''


4) 属性获取 / 属性匹配

a. 选取 lang 属性

demo6 = html.xpath('//@lang')
print(demo6)
# 运行结果:
'''['eng', 'eng']'''

b. 选取属性为 lang 的全部 title 元素

demo7 = html.xpath('//title[@lang]')
print(demo7)
# 运行结果:
'''[<Element title at 0x283dee53848>,

 <Element title at 0x283dee53808>]'''

c. 选取 lang 属性的值为 eng 全部 title 元素

demo8 = html.xpath('//title[@lang="eng"]')
print(demo8)
# 运行结果:
'''[<Element title at 0x251380c3808>, 

<Element title at 0x251380c37c8>]'''


5) 文本获取

demo9 = html.xpath('//title/text()')
print(demo9)
# 运行结果:
'''['Harry Potter', 'Learning XML']'''


6) 按序获取

a. 选取第一个 book 元素的 title

demo10 = html.xpath('//bookstore/book[1]/title/text()')
print(demo10)
# 运行结果:
'''['Harry Potter']'''

b. 选取最后一个 book 元素的 title 

demo11 = html.xpath(

                 '//bookstore/book[last()]/title/text()')
print(demo11)
# 运行结果:
'''['Learning XML']'''

c. 选取倒数第二个 book 元素的 price

demo12 = html.xpath(

          '//bookstore/book[last()-1]/price/text()')
print(demo12)
# 运行结果:
'''['29.99']'''

d. 选取前两个 book 元素的 price

demo13 = html.xpath(

 '//bookstore/book[position()<3]/price/text()')
print(demo13)
# 运行结果:
'''['29.99', '39.95']'''


参考文档

XPath 教程:

https://www.w3school.com.cn/xpath/index.asp


图片

https://mp.weixin.qq.com/s/SENEa6jBCyDVt5fMiOiXrw

相关文章
相关标签/搜索