爬虫进阶 - XPath应用

XPath学习

  • XPath 简介
  • XPath安装
  • XPath语法
  • XPath 使用
    • 用以 // 开头的 XPath 规则来选取所有符合要求的节点
    • 指定匹配的节点名称
    • 选择 li 节点的所有直接 a 子节点
    • 用@符号进行属性过滤
    • 调用 text()方法获取文本
    • @符号跟属性名直接获取节点的属性值
    • 多属性匹配

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应用_第1张图片
XPath 的常用匹配规则如下所示:
//title[@lang='eng']

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

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

  • 谓语示例

爬虫进阶 - XPath应用_第2张图片

  • 选取未知节点

爬虫进阶 - XPath应用_第3张图片

  • 通配符选取示例

爬虫进阶 - XPath应用_第4张图片

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

  • 选取若干路径示例
    爬虫进阶 - XPath应用_第5张图片

XPath 使用

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

<html><body><div>
    <ul>
        <li class="item-0"><a href="link1.html">first itema>li>
        <li class="item-1"><a href="link2.html">second itema>li>
        <li class="item-inactive"><a href="link3.html">third itema>li>
        <li class="item-1"><a href="link4.html">fourth itema>li>
        <li class="item-0"><a href="link5.html">fifth itema>
        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)

结果如下
爬虫进阶 - XPath应用_第6张图片

上述示例中 * 代表匹配所有节点,返回的结果是一个列表,每个元素都是一个 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 = '''
    
  • 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
    感谢!
    技术开源,知识共享,分享快乐!
    加油!

    你可能感兴趣的:(Python,xpath)