XPath:从入门到能用

发布于:2025-09-09 ⋅ 阅读:(14) ⋅ 点赞:(0)

1. 什么是 XPath?

XPath 全称 XML Path Language,是一种用于在 XML(Extensible Markup Language)或 HTML 文档中查找节点的语言。
它常用于:

  • Web 爬虫(如 Scrapy、lxml)
  • 自动化测试(如 Selenium、Appium)
  • XML 数据解析

如果把 HTML 看作一棵“标签树”,XPath 就是按照一定规则在这棵树中找到你想要的元素。


2. 基本语法结构

XPath 的路径书写类似于文件路径:

符号 含义
/ 从根节点开始,获取直接子节点
// 从当前节点开始,获取所有符合条件的子孙节点
. 当前节点
.. 父节点
@ 选取属性

例子:

/html/body/div

表示 HTML → body → div 的路径(只找直接子节点)。

//div

表示文档中所有<div> 元素,不管层级。

//div[@class="container"]

表示文档中所有 class 属性值为 container<div> 标签。


3. 常用节点选择方式

3.1 按标签名查找

//p                 # 找出所有<p>标签
/html/body/h1       # 找根路径下的<h1>

3.2 按属性查找

//div[@id="main"]                # id=main 的<div>
//input[@name="username"]        # 表单中 name=username 的<input>

3.3 属性值模糊匹配

//div[contains(@class, "main")]     # class 中包含 main
//a[starts-with(@href, "https")]    # href 以 https 开头

3.4 按文本内容查找

//a[text()="登录"]                        # 文本正好是“登录”
//a[contains(text(), "注册")]              # 文本包含“注册”

3.5 按层级关系查找

//div/span                 # div 的子孙节点 span
//div/*                    # div 的所有直接子元素

4. 位置匹配

有时候多个节点都匹配,我们只要第几个:

(//div[@class="item"])[1]   # 第一个匹配的 item
(//li)[last()]              # 最后一个<li>

5. 获取节点内容

在 HTML 解析中(以 Python + lxml 为例):

from lxml import etree

html = """
<html><body>
<div id="main">Hello</div>
<a href="https://example.com">点击</a>
</body></html>
"""

tree = etree.HTML(html)

# 1. 获取文本
text = tree.xpath('//div[@id="main"]/text()')
print(text)  # ['Hello']

# 2. 获取属性值
href = tree.xpath('//a/@href')
print(href)  # ['https://example.com']

6. 综合案例

假设 HTML:

<ul>
    <li class="item">苹果</li>
    <li class="item">香蕉</li>
    <li class="item">橙子</li>
</ul>

获取所有水果名:

//li[@class="item"]/text()

返回:['苹果', '香蕉', '橙子']

获取第二个水果名:

(//li[@class="item"]/text())[2]

返回:香蕉


7. XPath 与 CSS 选择器的对比

  • CSS 语法更短,适合前端开发(如 div#main > p.title)。
  • XPath 功能更强大,比如可以:
    • 按文本内容查找
    • 按数字位置查找
    • 结合逻辑条件(and / or)

很多时候,两者可以互换使用,但在爬虫和解析中,XPath 的自由度更高。


8. 常用技巧总结

  • // 可以从任意位置查找节点,最常用。
  • [ ] 用于添加过滤条件(属性、文本、位置)。
  • @attr 获取属性值,text() 获取标签的纯文本。
  • contains()starts-with() 常用于模糊匹配。
  • ( ... )[n] 取第 n 个匹配结果。

小练习:
给你一段 HTML:

<div class="news">
    <h2>今日热点</h2>
    <p class="summary">今天的头条是关于...</p>
    <a href="/readmore">阅读全文</a>
</div>

要求写出 XPath 表达式:

  1. 取出标题文字 今日热点
  2. 获取摘要文字
  3. 获取阅读全文链接的 href

答案参考:

1. //div[@class="news"]/h2/text()
2. //p[@class="summary"]/text()
3. //div[@class="news"]/a/@href

网站公告

今日签到

点亮在社区的每一天
去签到