Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • python 学习指南
  • python 中的设计模式
  • module

  • tool

  • other

    • scrapy shell
    • xpath
      • selector
      • case
      • 模糊查询
        • example
    • ipython
    • pyproject_toml文件
    • python中的反射
    • 统计学数学概念整理
    • setuptools打包与安装
    • 日志分析工具
  • 《python》
  • other
Jacky
2024-04-29
目录

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"
  • 路径表达式(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

# 模糊查询

调研是否有正则查询?

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
scrapy shell
ipython

← scrapy shell ipython→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式