爬虫进阶 - XPath应用
发布日期:2021-05-07 03:01:01 浏览次数:21 分类:精选文章

本文共 2285 字,大约阅读时间需要 7 分钟。

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,实例分析就按照这个文档来进行,文档内容如下:

用以 // 开头的 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 etreeprint('多属性匹配')text = '''    
  • first item
  • first item
  • '''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

    感谢!
    技术开源,知识共享,分享快乐!
    加油!

    上一篇:初识:神经网络(Neural Networks)
    下一篇:Java 手撕HashMap

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月08日 13时32分04秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章