xpath
XPath (opens new window) is a language for selecting nodes in XML documents, which can also be used with HTML. CSS is a language for applying styles to HTML documents. It defines selectors to associate those styles with specific HTML elements.
XPath 在 Web 抓取和数据提取中非常有用, 特别是在使用工具如 Scrapy 或 Beautiful Soup 进行网页解析时。你可以结合实际情况来编写 XPath 表达式, 以定位和提取所需的数据。要深入学习 XPath, 你可以查看 XPath 的规范文档以及相关教程和示例
# selector
以下是 XPath 的一些基本概念和表达式入门:
节点(Nodes):
- 元素节点(Element Nodes): XML 或 HTML 文档中的标签被称为元素节点, 如
<div>、<p> - 属性节点(Attribute Nodes): 元素节点中的属性, 如
<a href="example.com">中的 href 属性 - 文本节点(Text Nodes): 元素节点内的文本内容, 如
<p>Hello World</p>中的"Hello World"
- 元素节点(Element Nodes): XML 或 HTML 文档中的标签被称为元素节点, 如
路径表达式(Path Expressions):
- 使用斜杠
/表示从根节点开始的绝对路径, 如/html/body/div. - 使用双斜杠
//表示从任何位置开始的相对路径, 如//div.
- 使用斜杠
元素选择:
- 选择所有的元素节点:
//element_name, 例如//div选择文档中所有的<div>元素 - 选择特定元素节点:
/path/to/element, 例如/html/body/div选择特定路径下的<div>元素
- 选择所有的元素节点:
属性选择:
- 选择元素节点的属性:
//element/@attribute, 例如//a/@href选择所有<a>元素的href属性
- 选择元素节点的属性:
文本选择:
- 选择元素节点的文本内容:
//element/text(), 例如//p/text()选择所有<p>元素的文本内容
- 选择元素节点的文本内容:
条件(Predicates):
- 使用方括号
[]来添加条件, 如//div[@class="example"]选择 class 属性值为"example"的<div>元素
- 使用方括号
通配符:
*通配符可以匹配任何元素, 如//div/*选择<div>元素内的所有子元素
# case
// 从a的class为指定内容的元素中获取href列表
response.xpath("//a[@class='btn btn-min btn-warm']").xpath('@href').getall();
// 从class以btn btn-min开头的元素中提取href列表
response
.xpath("//a[starts-with(@class,'btn btn-min')]")
.xpath('@href')
.getall();
// 得到所有 iframe 的父节点元素列表
response.xpath('//iframe/..').getall();
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 模糊查询
调研是否有正则查询?
XPath 本身并不支持像正则表达式那样的模式匹配功能
如果您需要在 XML 中执行类似于正则表达式的文本匹配操作, 可以考虑使用 XPath 的一些其他功能和组合方法来达到目的:
- 基本选择器: XPath 支持选择特定类型的节点、特定名称的节点以及节点属性等。您可以使用这些基本选择器来定位目标节点
- 逻辑运算符: XPath 支持逻辑运算符, 如 and、or 和 not。您可以使用这些运算符来组合多个选择器, 并满足更复杂的选择条件
- 函数: XPath 提供了一些内置函数, 如
contains()、starts-with()和substring()等, 这些函数可以用于执行某些文本模式匹配操作 - 自定义扩展: 某些 XML 解析器或 XPath 库可能支持自定义函数或扩展, 您可以编写自定义函数来实现特定的文本匹配逻辑
虽然 XPath 本身并不支持正则表达式的功能, 但以上方法通常可以满足大多数 XML 解析和数据提取的需求。如果您需要更复杂的模式匹配操作, 可能需要将 XPath 结合其他语言或工具来实现, 比如结合 Python 的正则表达式库和 XPath 解析库来完成任务
# example
//book[contains(title, 'XML')]: 选择所有<book>元素, 其中<title>子元素的文本内容包含 "XML"//book[starts-with(author, 'John')]: 选择所有<book>元素, 其中<author>子元素的文本内容以 "John" 开头//book[starts-with(@class, 'comment')]: 选择所有<book>元素, 其 class 属性以 "comment" 开头的元素//*[starts-with(@class, 'comment')]: 选择所有元素, 其 class 属性以 "comment" 开头的元素substring('Hello World', 7): 上述 XPath 表达式将返回 "World", 因为它提取了从第 7 个字符开始的子字符串//@*[contains(., 'http://') or contains(., 'https://')]: 这个表达式会选择所有属性值中包含 "http://" 或 "https://" 的元素@*: 表示选择当前节点的所有属性。例如,@href表示选择当前节点的 href 属性.: 表示当前节点。在这种情况下, contains(., 'http://') 表达式将检查当前节点的文本内容是否包含 "http://" 字符串
上次更新: 2025/07/17, 17:31:43