python网络爬虫精解之XPath的使用说明

 更新时间:2021年09月27日 08:38:19   作者:小狐狸梦想去童话镇  
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上

XPath的使用

一、XPath的介绍

XPath的几个常用规则:

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
选取当前节点的父节点
@ 选取属性

二、XPath使用

1、选取所有节点

test01.html

<book class="item">
  <title lang="en" class="item-01">Harry Potter</title>
  <author class="item-02 name">J K. Rowling</author> 
  <year>2005</year>
  <price>29.99</price>
</book>
from lxml import etree

html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//*')
print(result)

运行程序后得到一个列表:

[<Element html at 0x2252aff0d88>, <Element body at 0x2252aff0e48>, <Element book at 0x2252aff0e88>, <Element title at 0x2252aff0ec8>, <Element author at 0x2252aff0f08>, <Element year at 0x2252aff0f88>, <Element price at 0x2252aff0fc8>]

列表中每个元素代表原test01.html文件中的节点,可以看出节点有html、body、book、title、author、year、price节点。

2、获取子节点

如果想要获取book节点下的author节点,则可将代码编写为:

from lxml import etree

html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//author')
print(result)

这样仅可获得author节点:[<Element author at 0x2252aef8748>]

3、获取父节点

获取当前节点的父节点,主要是父节点的属性值。

以获取父节点book的class属性值为例。

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//title[@class="item-01"]/../@class') #获取title节点的父节点的class属性值
print(result)

【运行结果】

['item']

通过查阅之前test01.html的源码可知,父节点book的class属性值为“item”。

4、属性匹配

我们知道每个节点几乎都带有属性,通过属性匹配我们可以匹配具有相同节点名但属性不同的节点。

通常是将需要匹配的属性放在中括号内。

例如,用属性匹配的方式获取title节点。

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//title[@lang="en"]')
print(result)

【运行结果】

[<Element title at 0x2252afb2a48>]

则得到了title节点。

5、文本获取

一般我们爬取的内容都是文本形式,我们使用text()方式将文本内容提取出来。

在上一个实例的基础上,我们获取标题的具体内容。

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//title[@lang="en"]/text()')
print(result)

【运行结果】

['Harry Potter']

这样我们就得到了具体的标题名称。

6、属性获取

有时候我们想要的数据不在文本内容,而是在节点的属性值里,因此我们还需要学会获取节点的属性值。

常用方式是在需要获取的属性值前面加@符号即可。

例如,我们获取标题title的lang和class这两个属性值。

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//title/@lang')
result.append(html.xpath('//title/@class')[0])
print(result)

【运行结果】

['en', 'item-01']

这样我们就完成了属性值的获取。

7、属性多值匹配

有时候属性值并不只有一个,而是具有多个属性值,像实例中author节点的class属性值,具有两个值item-02和name,通常我们在匹配时使用contains()方法,该方法的第一个参数传入属性名称,第二个参数传入属性值(多个属性值中的任意一个)。

我们以获取作者姓名为例:

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//author[contains(@class,name)]/text()')
print(result)

【运行结果】

['J K. Rowling']

8、多属性匹配

一个节点通常会有多个属性,例如实例中的title节点,就具有lang和class节点,在进行多属性匹配时,使用and符来连接。

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//title[@lang="en" and @class="item-01"]/text()')
print(result)

【运行结果】

['Harry Potter']

以下是常见的运算符:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GyHoIIVB-1631169770821)(D:\Users\31156\Desktop\网络爬虫\img\img11.jpg)]

9、按序选择

实例test02.html

<bookstore>
<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>
<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>
</bookstore>

我们还是按照之前讲的,获取book节点下的title名。

from lxml import etree
html = etree.parse('./test02.html',etree.HTMLParser())
result = html.xpath('//book/title/text()')
print(result)

【运行结果】

['Harry Potter', 'Learning XML']

这时我们看到有两个标题名,在处理时,我们可以在中括号中传入索引获取指定次序的节点。

获取依次节点的值:

from lxml import etree
html = etree.parse('./test02.html',etree.HTMLParser())
result1 = html.xpath('//book[1]/title/text()')
result2 = html.xpath('//book[2]/title/text()')
print(result1)
print(result2)

【运行结果】

['Harry Potter']
['Learning XML']

还有一些其他方法,例如获取最后一个节点用last()等,其他操作函数可参考:XPath函数

10、节点轴选择

在这里插入图片描述

这些节点轴可以帮助我们更快速的进行匹配。

到此这篇关于python网络爬虫精解之XPath的使用说明的文章就介绍到这了,更多相关python XPath内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python基于递归实现电话号码映射功能示例

    Python基于递归实现电话号码映射功能示例

    这篇文章主要介绍了Python基于递归实现电话号码映射功能,结合实例形式分析了Python针对字典的递归、遍历相关操作技巧,需要的朋友可以参考下
    2018-04-04
  • 如何在sublime编辑器中安装python

    如何在sublime编辑器中安装python

    这篇文章主要介绍了如何在sublime编辑器中安装python,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 利用python绘制笛卡尔直角坐标系

    利用python绘制笛卡尔直角坐标系

    这篇文章主要介绍了利用python绘制笛卡尔直角坐标系,python绘图主要用到matplotlib绘图模块,利用matplotlib模块画出上面的正弦函,需要的朋友可以参考一下
    2022-03-03
  • python list 切片倒着取的实现示例

    python list 切片倒着取的实现示例

    切片操作非常灵活,可以按照需要获取列表中的任意一段元素,本文主要介绍了python list 切片倒着取的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 用OpenCV将视频分解成单帧图片,图片合成视频示例

    用OpenCV将视频分解成单帧图片,图片合成视频示例

    今天小编就为大家分享一篇用OpenCV将视频分解成单帧图片,图片合成视频示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python从文件中读取指定的行以及在文件指定位置写入

    Python从文件中读取指定的行以及在文件指定位置写入

    这篇文章主要给大家介绍了关于Python从文件中读取指定的行及在文件中指定位置写入的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • python实现比较文件内容异同

    python实现比较文件内容异同

    这篇文章主要为大家详细介绍了python实现比较文件内容异同,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • python绘制饼图和直方图的方法

    python绘制饼图和直方图的方法

    这篇文章主要为大家详细介绍了python绘制饼图和直方图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • python中使用序列的方法

    python中使用序列的方法

    这篇文章主要介绍了python中使用序列的方法,较为详细的分析了Python序列的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 使用相同的Apache实例来运行Django和Media文件

    使用相同的Apache实例来运行Django和Media文件

    这篇文章主要介绍了使用相同的Apache实例来运行Django和Media文件,Django是最具人气的Python web开发框架,需要的朋友可以参考下
    2015-07-07

最新评论