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>

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

  • 是根节点;
  • 的子节点;
  • 两个

    标签是兄弟节点,都属于

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/body: 从 找到 节点。
  • /html/body/div: 向 下查找所有直接的
    子节点
查询所有匹配的节点
  • //div: 从文档里选中所有
    节点(无论深度)。
  • //*[@id="para1"]:定位 id 为 para1 的节点(@attr="value"是通用定位属性的格式)。

2. 位置选取语法

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

单个节点索引选择
  • /html/body/div[1]: 查找 下的 第1个
  • //p[2]: 文档中第二个

    节点(基于层次顺序,从发现的位置依次排序)。

  • (//div)[last()]:选择页面中最后一个
    节点。
结合多个位置过滤

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

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

位置相关的常用函数

  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" 的所有

    节点。

  • //div[@class='content']//p[@class='special']:包含嵌套的父子组合条件。
含动态匹配:

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


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

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

  • //h1[text()='这是标题']: 精确匹配 文本为“这是标题”

  • //p[contains(text(), '第1段')]: 查找包含文本“第1段”的所有段落。

5. 多条件组合查询

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


结合 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 标题和所有

的文本内容:

from lxml import etree

html = """

    
        

这是标题

第1段内容

第2段内容

"""
# 转换为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 requests

url = "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


你可能感兴趣的:(网络协议,前端)