欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > XPath简介——完整入门和详解

XPath简介——完整入门和详解

2025/2/23 22:15:46 来源:https://blog.csdn.net/wanganqiqi/article/details/144642681  浏览:    关键词:XPath简介——完整入门和详解

XPath简介——完整入门和详解

      • **XPath的用法场景**
      • **XPath的基本语法**
        • **1. 树型结构概念**
        • **2. XPath基本路径语法**
    • **定位方式及详细语法讲解**
      • 示例 HTML 结构:
      • **1. 路径选择**
        • **基础语法:层级表示法**
        • **查询所有匹配的节点**
      • **2. 位置选取语法**
        • **单个节点索引选择**
        • **结合多个位置过滤**
      • **3. 属性条件过滤**
        • 属性查询示例:
        • 含动态匹配:
      • **4. 文本内容或特定值查找**
      • **5. 多条件组合查询**
    • **结合 Python 的实际用法**
      • 例子:找出 “这是标题”和所有段落的文本
      • 爬取带属性图片链接或动态数据:
    • **总结:高效使用XPath的方法**

XPath(全称 XML Path Language)是一种用于 定位 XML 或 HTML(网页内容)文档中的元素 的查询语言。对于从事爬取网页或解析数据, XPath 是一项非常有用的工具,它可以高效地查找和提取目标内容。


XPath的用法场景

  1. 解析 HTML/XML
    XPath 是一种通用语言,可以从 HTML 或 XML 文文件中提取节点和属性信息。
  2. 常用于动态网页的爬取
    与工具如 lxmlBeautifulSoup 或浏览器驱动程序自动化工具(如 Selenium)配合使用。
  3. 适配层次结构
    尤其适用于深层次嵌套结构的文档导航功能。

XPath的基本语法

XPath 使用一种类文件夹/树形结构的路径表达式,通过路径选择其中的“节点”。其运行依赖于以下几个关键概念:

1. 树型结构概念

首先,我们需要了解一个网页的 DOM 结构就像一棵 ,其主要包括:

  • 根节点 (/html)
  • 父节点和子节点
  • 兄弟节点

例如,一个简单的 HTML 结构:

<html><body><div class="content"><p id="para1">第1段内容</p><p id="para2">第2段内容</p></div></body>
</html>

这部分结构可以作为树一起理解,其中:

  • <html> 是根节点;
  • <body><html> 的子节点;
  • 两个 <p> 标签是兄弟节点,都属于 <div>

XPath 就基于这样的 DOM 树结构定位和查询。


2. XPath基本路径语法

XPath 提供了层次化的路径选择,也可以使用一些快捷的方式直接找目标。

  • / 单斜杠:从 根部(文档根节点)选择
  • // 双斜杠:选择文档中 符合条件的所有节点(在文档中的任意位置出现)
  • . 点:当前节点
  • .. 双点:父节点

定位方式及详细语法讲解

我们分为一个示例,假设页面内容如下,分析如何通过 XPath 定位内容。

示例 HTML 结构:

<html><body><div class="header"><h1>这是标题</h1></div><div class="content"><p id="para1">第1段内容</p><p class="special" id="para2">第2段内容</p><a href="https://example.com/resource" target="_blank">点击下载</a></div></body>
</html>

1. 路径选择

基础语法:层级表示法
  • /html:直接定位 <html>(根节点)。
  • /html/body: 从 <html> 找到 <body> 节点。
  • /html/body/div: 向 <body> 下查找所有直接的 <div> 子节点
查询所有匹配的节点
  • //div: 从文档里选中所有 <div> 节点(无论深度)。
  • //*[@id="para1"]:定位 id 为 para1 的节点(@attr="value"是通用定位属性的格式)。

2. 位置选取语法

有时候,节点过多,我们可以使用特定位置语法来精确定位。

单个节点索引选择
  • /html/body/div[1]: 查找 <body> 下的 第1个 <div>
  • //p[2]: 文档中第二个 <p> 节点(基于层次顺序,从发现的位置依次排序)。
  • (//div)[last()]:选择页面中最后一个 <div> 节点。
结合多个位置过滤

XPath 可以结合位置使用,进一步限制条件:

  • /html/body/div[2]/p[@class='special']: <body> 下第二个 <div> 内,class 属性为 special<p>

位置相关的常用函数

  1. [last()]: 定位最后一个匹配的节点。
  2. [position()][number]:选择某个位置。

3. 属性条件过滤

假设您需要找到带有特定属性(如 id、class)的节点,常见过滤语法包括:

tag[@attr='value']    # 标准过滤
tag[contains(@attr, 'part')]    # 包含指定内容的属性
tag[starts-with(@attr, 'key')]  # 属性起始字符串
属性查询示例:
  • //p[@id='para2']: 带 id="para2" 的所有 <p> 节点。
  • //div[@class='content']//p[@class='special']:包含嵌套的父子组合条件。
含动态匹配:

XPath 提供动态查询选项,例如仅匹配部分内容:

  • //a[contains(@href, 'example.com')]:定位 <a> 标签中 href 包含字符串 example.com 的节点。
  • //p[starts-with(@id, 'para')]:所有 idpara 开头的段落节点。

4. 文本内容或特定值查找

XPath 同样支持查找包含特定文本节点的方式:

  • //h1[text()='这是标题']: 精确匹配 文本为“这是标题”<h1>
  • //p[contains(text(), '第1段')]: 查找包含文本“第1段”的所有段落。

5. 多条件组合查询

XPath 支持多条件,符号 | 表示逻辑“或”,组合多个条件。

  • //p[@id='para2'] | //a: 查找 id 为 para2 的段落,所有 <a> 节点。
  • //p[@id='para1' and @class='normal']: 拥有两个属性条件的 p 节点。

结合 Python 的实际用法

通常爬取网页时,XPath 的工作方式如下:

例子:找出 “这是标题”和所有段落的文本

假设以下网站的简单 HTML 内容:

<html><body><div class="header"><h1>这是标题</h1></div><div class="content"><p id="para1">第1段内容</p><p id="para2">第2段内容</p></div></body>
</html>

lxmlh1 标题和所有 <p> 的文本内容:

from lxml import etreehtml = """
<html><body><div class="header"><h1>这是标题</h1></div><div class="content"><p id="para1">第1段内容</p><p id="para2">第2段内容</p></div></body>
</html>
"""# 转换为XPath对象
tree = etree.HTML(html)# 获取标题内容
title = tree.xpath("//h1/text()")[0]
print("标题:", title)# 获取所有段落文本
paragraphs = tree.xpath("//p/text()")
print("段落内容:", paragraphs)

运行效果:

标题: 这是标题
段落内容: ['第1段内容', '第2段内容']

爬取带属性图片链接或动态数据:

许多实际使用 XPath 的场景可以直接抓图片信息:

from lxml import etree
import requestsurl = "https://example.com/examplewebpage"
resp = requests.get(url)
html = etree.HTML(resp.text)# 查找所有图片链接
images = html.xpath("//img[@src]/@src")
for img in images:print(img)# 根据动态名称过滤
filtered_images = html.xpath("//img[contains(@src, 'logo')]/@src")
print("Filtered images:", filtered_images)

总结:高效使用XPath的方法

  1. 灵活使用路径与层次
    掌握 ///@attrtext() 等基础语法。

  2. 结合 DOM 检查工具调试
    使用浏览器开发者工具(快捷键: F12 > Elements tab),用 XPath 定位节点,提高精确性。

  3. 配合 Python 库,如 lxml 等解析 HTML


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词