爬虫进阶 - XPath应用

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫进阶 - XPath应用相关的知识,希望对你有一定的参考价值。

XPath 简介

XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。最初是用来搜寻XML 文档的,但同样适用于 html 文档的搜索。所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。

XPath 的选择功能十分强大,它提供了非常简洁明了的路径选择表达式。另外,它还提供了超过 100 个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有想要定位的节点都可以用 XPath来选择。

官方文档:https://www.w3.org/TR/xpath/。

XPath安装

pip install lxml

XPath语法

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是沿着路径(path)或者步(steps)来选取的。下面列举了一些常用的路径表达式进行节点的选取,如表所示:
在这里插入图片描述
XPath 的常用匹配规则如下所示:
//title[@lang='eng']

  上述 XPath 匹配规则代表的是选择所有名称为title,同时属性 lang 的值为 eng 的节点,后面会通过 Python 的 lxml 库,利用 XPath 进行 HTML 的解析。

  上面路径都是选取了所有符合条件的节点,是否能选取某个特定的节点或者包含某一个指定值得节点,这就需要用到谓语谓语被嵌在方括号中,用来查找某个特定的节点或者包含某个指定的值的节点

  • 谓语示例

在这里插入图片描述

  • 选取未知节点

在这里插入图片描述

  • 通配符选取示例

在这里插入图片描述

通过在路径表达式中使用“|”运算符,您可以选取若干个路径

  • 选取若干路径示例
    在这里插入图片描述

XPath 使用

首先给出 XPath_test.html,实例分析就按照这个文档来进行,文档内容如下:

<html><body><div>
    <ul>
        <li class="item-0"><a href="link1.html">first item</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="link4.html">fourth item</a></li>
        <li class="item-0"><a href="link5.html">fifth item</a>
        </li>
    </ul>
</div> </body></html>

用以 // 开头的 XPath 规则来选取所有符合要求的节点

from lxml import etree

# 第一个参数,解析的HTML文件, etree.HTMLParser解析器
html = etree.parse('./xpath_test.html', etree.HTMLParser())

# 获取所有节点
result = html.xpath('//*')
print(result)

结果如下
在这里插入图片描述

上述示例中 * 代表匹配所有节点,返回的结果是一个列表,每个元素都是一个 Element 类型,后跟节点名称
也可以指定匹配的节点名称,示例如下。

指定匹配的节点名称

from lxml import etree

# 第一个参数,解析的HTML文件, etree.HTMLParser解析器
html = etree.parse('./xpath_test.html', etree.HTMLParser())

# 获取所有节点
print("获取ul节点")
result = html.xpath('//ul')
print(result)

print(html.xpath('//li'))

通过 / 或 // 即可查找元素的子节点或子孙节点。选择 li 节点的所有直接 a 子节点。

选择 li 节点的所有直接 a 子节点

from lxml import etree 
html = etree.parse('./XPath_test.html', etree.HTMLParser()) 
result = html.xpath('//li/a') print(result)

用@符号进行属性过滤

print('根据属性选择')
# @ 是属性选择, 单引号中用双引号
print(html.xpath('//li[@class="item-inactive"]'))

print('获取节点下子节点')
print(html.xpath('//li[@class="item-inactive"]/a'))

调用 text()方法获取文本

print('获取节点文本')
# text() 获取节点文本
print(html.xpath('//li[@class="item-inactive"]/a/text()'))

@符号跟属性名直接获取节点的属性值

print('获取节点的属性值')
# @href:获取属性值, li 下 a标签 的 href属性值
print(html.xpath('//li[@class="item-inactive"]/a/@href'))

多属性匹配

from lxml import etree

print('多属性匹配')
text = '''
    <li class="li li-first" name="item"><a href="link.html">first item</a></li>
    <li class="li" name="item"><a href="link.html">first item</a></li>
'''

html = etree.HTML(text)
print(html.xpath('//li[@class="li li-first" and @name="item"]'))

# 包含 contains(@class, "li")
print(html.xpath('//li[contains(@class, "li") and @name="item"]'))

摘自尚学堂PDF
感谢!
技术开源,知识共享,分享快乐!
加油!

以上是关于爬虫进阶 - XPath应用的主要内容,如果未能解决你的问题,请参考以下文章

全网最全python爬虫系统进阶学习(附原代码)学完可就业

Python爬虫从入门到进阶之xpath的使用

爬虫进阶数据提取-lxml模块(万能操作)

浅识XPath(熟练掌握XPath的语法)python爬虫入门进阶(03)

进一步了解XPath(利用XPath爬取飞哥的博客)python爬虫入门进阶(04)

进一步了解XPath(利用XPath爬取飞哥的博客)python爬虫入门进阶(04)