Scrapy与分布式开发(2.3):lxml+xpath基本指令和提取方法详解

lxml+xpath基本指令和提取方法详解

一、XPath简介

XPath,全称为XML Path Language,是一种在XML文档中查找信息的语言。它允许用户通过简单的路径表达式在XML文档中进行导航。XPath不仅适用于XML,还常用于处理HTML文档。

二、基本指令和提取方法

选择节点

使用XPath,你可以轻松地选择XML文档中的节点。
* 选择根节点:/
* 选择子节点:/parent/child
* 选择所有节点://*
* 后代节点选择:使用//descendant选择文档中的任意后代节点,无论层级。
* 相邻节点选择:使用/sibling1/following-sibling::sibling2选择相邻的同级节点。

使用轴

XPath提供了多种轴,允许你基于节点之间的关系进行选择。
* 子轴:/parent/child
* 同胞轴:/parent/child1/following-sibling::child2
* 属性轴:/parent/child/@attribute

使用谓语

谓语用于过滤节点集,帮助你更精确地定位节点。
* 选择第一个节点:/parent/child[1]
* 选择具有特定值的节点:/parent/child[@attribute='value']
* 选择多个满足条件的节点:/parent/child[position() > 1]
* 使用/parent/child/@attribute直接选择属性节点。
* 使用/parent/child[position()]根据节点在父节点下的位置进行选择。例如,[1]表示第一个子节点,[last()]表示最后一个子节点。
* 使用/parent/child[text()='value']选择文本内容等于特定值的节点。
* 使用andor进行多条件选择,如/parent/child[@attribute1='value1' and @attribute2='value2']

提取加粗样式文本

XPath不仅可以定位节点,还可以提取节点的文本内容。
* 使用text()函数提取节点的文本内容,如/parent/child/text()
* 使用string()函数提取节点的字符串表示,适用于复杂节点结构。
* 直接使用/@attribute提取节点的属性值,如/parent/child/@attribute
* 使用逗号,分隔多个XPath表达式,一次性提取多个节点或属性,如/parent/(child1, child2, @attribute)
* 使用.表示当前节点及其所有子节点,如node()函数。

三、实例演示

下面是一些XPath查询的实例,演示了如何使用XPath来提取XML文档中的数据。

XML文档示例

<bookstore><book><title lang="en">Harry Potter</title><author>J.K. Rowling</author><price>29.99</price></book><book><title lang="en">Learning XML</title><author>Erik T. Ray</author><price>39.95</price></book><book><title lang="zh-CN">西游记</title><author>吴承恩</author><price>28.80</price></book>
</bookstore>

选择所有书名
XPath表达式:/bookstore/book/title
结果:<title lang="en">Harry Potter</title>, <title lang="en">Learning XML</title>, <title lang="zh-CN">西游记</title>

选择第二本书的价格
XPath表达式:/bookstore/book[2]/price
结果:<price>39.95</price>

选择所有英文书名
XPath表达式:/bookstore/book/title[@lang='en']
结果:<title lang="en">Harry Potter</title>, <title lang="en">Learning XML</title>

选择价格高于30的所有书籍
XPath表达式:/bookstore/book[price > 30]
结果:<book>...</book>(包含Learning XML这本书的信息)

选择所有书籍的作者名字
XPath表达式:/bookstore/book/author/text()
结果:J.K. Rowling, Erik T. Ray, 吴承恩

选择第一本书的标题文本
XPath表达式:/bookstore/book[1]/title/text()
结果:Harry Potter

选择所有书籍的价格(作为文本)
XPath表达式:/bookstore/book/price/text()
结果:29.99, 39.95, 28.80

选择所有具有属性的title节点
XPath表达式://title[@*]
结果:所有带有属性的<title>节点,如<title lang="en">Harry Potter</title>

提取多个节点并返回其文本
XPath 表达式:/bookstore/book/(title/text(), author/text())
结果:对于每一本书,返回其标题和作者的文本内容,例如第一本书返回 ("Harry Potter", "J.K. Rowling")

提取节点的直接子节点
XPath 表达式:/bookstore/book/price
结果:返回所有<price>节点,因为<price><book>的直接子节点。

提取节点的所有子节点
XPath 表达式:/bookstore/book/*
结果:对于每一本书,返回其所有子节点,即<title>, <author>, 和 <price>

提取节点的属性
XPath 表达式:/bookstore/book/title/@lang
结果:返回所有<title>节点的lang属性值,例如"en""zh-CN"

提取节点的父节点
XPath 表达式:/bookstore/book/price/parent::book
结果:返回每个<price>节点的父节点<book>

提取节点的前一个或后一个同级节点
XPath 表达式:/bookstore/book[2]/title/previous-sibling::title/bookstore/book[2]/title/next-sibling::title
结果:分别返回第二本书标题的前一个和后一个同级标题节点(在这个例子中,因为第二本书是第一个,所以前一个同级节点不存在,后一个同级节点是第三本书的标题)。

提取节点的祖先节点
XPath 表达式:/bookstore/book/title/ancestor::bookstore
结果:返回每个<title>节点的祖先<bookstore>节点。

提取节点及其所有后代节点
XPath 表达式:/bookstore/book[1]
结果:返回第一本书及其所有后代节点,即完整的第一本书的信息。

提取满足条件的节点集合
XPath 表达式:/bookstore/book[price > 30]
结果:返回价格大于30的所有<book>节点。

四、lxml应用xpath

在Python中,lxml是一个功能强大的库,用于解析XML和HTML文档。结合XPath,我们可以轻松地定位和提取文档中的特定信息。下面是一个关于如何使用lxml和XPath进行XML解析和数据提取的详细讲解,重点在于提供实用指令和文本提取方法。

安装lxml

首先,确保你已经安装了lxml库。如果没有,可以通过pip进行安装:

pip install lxml

加载XML文档

使用lxmletree模块加载XML文档:

from lxml import etree
# 加载XML文档
tree = etree.parse('example.xml')

使用XPath提取数据

  1. 选择节点
    选择所有<book>节点:
books = tree.xpath('/bookstore/book')
  1. 选择特定节点
    选择第一个<book>节点:
first_book = tree.xpath('/bookstore/book[1]')
  1. 选择节点属性
    选择所有<book>节点的title属性值:
titles = tree.xpath('/bookstore/book/title/@lang')
  1. 选择节点的文本内容
    选择所有<title>节点的文本内容:
titles_text = tree.xpath('/bookstore/book/title/text()')
  1. 选择多个节点及其文本内容
    选择所有<book>节点的<title><author>文本内容:
books_info = tree.xpath('/bookstore/book/(title/text(), author/text())')
  1. 条件选择
    选择价格大于30的<book>节点:
expensive_books = tree.xpath('/bookstore/book[price > 30]')
  1. 选择后代节点
    选择所有<price>后代节点:
prices = tree.xpath('//price')

实战演示

案例一:提取博客文章标题
from lxml import etree  # 假设html_content是博客网页的HTML内容  
html_content = """  
<html>  
<head>  <title>My Blog</title>  
</head>  
<body>  <h1>Welcome to My Blog</h1>  <div class="post">  <h2>Article 1 Title</h2>  <p>Article 1 content...</p>  </div>  <div class="post">  <h2>Article 2 Title</h2>  <p>Article 2 content...</p>  </div>  
</body>  
</html>  
"""  # 解析HTML  
tree = etree.HTML(html_content)  # 使用XPath定位所有<h2>元素并提取文本内容  
article_titles = tree.xpath('//h2/text()')  # 打印文章标题  
for title in article_titles:  print(title.strip())  # 使用strip()移除可能存在的空白字符
案例二:提取链接和链接文本
from lxml import etree  html_content = """  
<html>  
<head>  <title>Links Page</title>  
</head>  
<body>  <p>Here are some links:</p>  <ul>  <li><a href="https://example.com/link1">Link 1</a></li>
<li><a href="https://example.com/link2">Link 2</a></li>  <li><a href="https://example.com/link3">Link 3</a></li>  </ul>  
</body>  
</html>  
"""  # 解析HTML  
tree = etree.HTML(html_content)  # 使用XPath提取所有链接和链接文本  
links = tree.xpath('//a')  
for link in links:  link_text = link.text.strip()  # 提取链接文本并移除空白字符  link_href = link.get('href')  # 提取href属性  print(f"Link Text: {link_text}, Link: {link_href}")
案例三:提取链接和链接文本
from lxml import etree  html_content = """  
<html>  
<head>  <title>Table Page</title>2</th>  <th>Header 3</th>  </tr>  <tr>  <td>Row 1, Col 1</td>  <td>Row 1, Col 2</td>  <td>Row 1, Col 3</td>  </tr>  <tr>  <td>Row 2, Col 1</td>  <td>Row 2, Col 2</td>  <td>Row 2, Col 3</td>  </tr>  </table>  
</body>  
</html>  
"""  # 解析HTML  
tree = etree.HTML(html_content)  # 使用XPath提取表格的所有行  
table_rows = tree.xpath('//table/tr')  # 遍历行并提取单元格数据  
for row in table_rows:  # 提取单元格数据,这里假设所有行都有相同数量的列  cells = row.xpath('td|th')  row_data = [cell.text.strip() for cell in cells]  print(row_data)

注意事项

  • XPath表达式是大小写敏感的,确保你的标签名与XML文档中的大小写一致。
  • 如果XML文档中有命名空间,你可能需要在XPath表达式中处理它们。

经验之谈

借用浏览器快速获取xpath指令

打开浏览器进入开发者模式,选定要提取的位置,然后右键按下图流程处理即可快速获取该位置的xpath选择命令
在这里插入图片描述

XPath Helper

浏览器插件XPath Helper可以让我们直观看到自己的选择命令是不是合理的
在这里插入图片描述

代码提取不到但是浏览器可以?

有时候会出现明明浏览器直接copy的指令,或者我们通过浏览器确定是可以的指令,但是在代码执行却提取失败,这种常见的可能性是:网页返回的html文本结构是A,但是经过浏览器渲染后变成了B,这让我们用B的指令去提取A,肯定得不到结果,这种在表格中比较常见,特别table > tbody > tr这一层,如果网页本身没有tbody,浏览器一般会自动渲染上。
解决方法:

  • 代码调试
  • 查看网页源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/271417.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch续写tensorboard

模型训练到一半有 bug 停了&#xff0c;可以 resume 继续炼&#xff0c;本篇给出 pytorch 在 resume 训练时续写 tensorboard 的简例&#xff0c;参考 [1-3]&#xff0c;只要保证 writer 接收的 global step 是连着的就行。 Code import numpy as np from torch.utils.tensor…

【node版本问题】运行项目报错 PostCSS received undefined instead of CSS string

最近该项目没有做任何修改&#xff0c;今天运行突然跑不起来报错了 PostCSS received undefined instead of CSS string 【原因】突然想起来期间有换过 node 版本为 16.17.1 【解决】将 node 版本换回之前的 14.18.0 就可以了

电脑不小心格式化了,怎么恢复?

在这个数字化时代&#xff0c;电脑已经成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;有时我们可能会不小心格式化电脑硬盘&#xff0c;导致重要数据的丢失。那么&#xff0c;电脑不小心格式化了&#xff0c;怎么恢复&#xff1f; 别着急&#xff0c;在本篇攻略中&…

25考研资料PDF汇总

资料V馊public号ZL研知己 V馊public号ZL研知己 25考研资料PDF汇总

开关电源安规测试标准与测试要求

安规测试是对开关电源进行电气性能、安全性能等检测&#xff0c;确保开关电源符合规定并且安全可靠&#xff0c;为开关电源的质量把关。那么开关电源安规测试有哪些测试要求和标准呢&#xff1f; 开关电源安规测试要求 一、测试前 1. 首先&#xff0c;要检查测试环境&#xff0…

Python数据处理实战(5)-上万行log数据提取并分类进阶版

系列文章&#xff1a; 0、基本常用功能及其操作 1&#xff0c;20G文件&#xff0c;分类&#xff0c;放入不同文件&#xff0c;每个单独处理 2&#xff0c;数据的归类并处理 3&#xff0c;txt文件指定的数据处理并可视化作图 4&#xff0c;上万行log数据提取并作图进阶版 …

基于OpenCV的图形分析辨认02

目录 一、前言 二、实验目的 三、实验内容 四、实验过程 一、前言 编程语言&#xff1a;Python&#xff0c;编程软件&#xff1a;vscode或pycharm&#xff0c;必备的第三方库&#xff1a;OpenCV&#xff0c;numpy&#xff0c;matplotlib&#xff0c;os等等。 关于OpenCV&…

WPF学习三(MVVM+自定义按钮等的登录界面)

跟着bilibil龙马哥视频做的一个登录界面&#xff0c;个人感觉讲得很到位&#xff0c;适合新手&#xff09;&#xff0c;他是从开始的前后绑定慢慢解耦合到MVVM&#xff0c;让我较快的理解了WPF的基础。 【WPF入门】WPF零基础到精通&#xff0c;从概念到实操&#xff0c;步步提升…

换手机后日记不见了怎么恢复?换手机日记内容同步方法

曾经&#xff0c;我使用的是一款苹果手机&#xff0c;这部手机陪伴了我整整3年。随着时间的推移&#xff0c;手机内存不够用成为了我面临的一个大问题&#xff0c;因此我决定更换一部新手机——这次我选择了OPPO品牌。在更换手机的过程中&#xff0c;我利用手机搬家软件一键同步…

英语四级开始报名了?大学生如何三个月突破四级【文章底部添加进大学生就业交流群】

目录 一、明确考试内容与要求 二、制定合理的复习计划 三、注重听力和阅读能力的提升 四、加强词汇和语法的积累 五、多做真题和模拟题 英语四级考试&#xff0c;对于大多数大学生来说&#xff0c;是检验英语水平的一个重要标准。随着报名时间的来临&#xff0c;许多同学都…

vue3 ref获取子组件显示 __v_skip : true 获取不到组件的方法 怎么回事怎么解决

看代码 问题出现了 当我想要获取这个组件上的方法时 为什么获取不到这个组件上的方法呢 原來&#xff1a; __v_skip: true 是 Vue 3 中的一个特殊属性&#xff0c;用于跳过某些组件的渲染。当一个组件被标记为 __v_skip: true 时&#xff0c;Vue 将不会对该组件进行渲染&am…

开源模型应用落地-工具使用篇-Spring AI-高阶用法(九)

一、前言 通过“开源模型应用落地-工具使用篇-Spring AI-Function Call&#xff08;八&#xff09;-CSDN博客”文章的学习&#xff0c;已经掌握了如何通过Spring AI集成OpenAI以及如何进行function call的调用&#xff0c;现在将进一步学习Spring AI更高阶的用法&#xff0c;如…

vscode 使用ssh进行远程开发 (remote-ssh),首次连接及后续使用,详细介绍

在vscode添加remote ssh插件 首次连接 选择左侧栏的扩展&#xff0c;并搜索remote ssh 它大概长这样&#xff0c;点击安装 安装成功后&#xff0c;在左侧栏会出现远程连接的图标&#xff0c;点击后选择ssh旁加号便可以进行连接。 安装成功后vscode左下角会有一个图标 点击图…

08.回调地狱函数及其解决(Promise链式调用)

一.同步代码和异步代码 1. 同步代码&#xff1a; 逐行执行&#xff0c;需原地等待结果后&#xff0c;才继续向下执行 2. 异步代码&#xff1a; 调用后耗时&#xff0c;不阻塞代码继续执行&#xff08;不必原地等待&#xff09;&#xff0c;在将来完成后触发回调函数传递结果…

Windows上基于名称快速定位文件和文件夹的免费工具Everything

在Windows上搜索文件时&#xff0c;使用windows上内置搜索会很慢&#xff0c;这里推荐使用Everything工具进行搜索。 "Everything"是Windows上一款搜索引擎&#xff0c;它能够基于文件名快速定位文件和文件夹位置。不像Windows内置搜索&#xff0c;"Everything&…

Docker-完整项目的部署(保姆级教学)

目录 1 手动部署(白雪版) 1.1 创建网络 1.2 MySQL的部署 1.2.1 准备 1.2.2 部署 1.3 Java项目的部署 1.3.1 准备 1.3.1.1 将Java项目打成jar包 1.3.1.2 编写Dockerfile文件 1.3.2 部署 1.3.2.1 将jar包、Dockerfile文件放在linux同一个文件夹下 1.3.2.2 构建镜像 …

飞行汽车首飞成功?一文讲解飞行汽车与其代表的立体交通形式

中国的“飞行汽车”从深圳跨越大湾区到珠海首飞成功&#xff0c;既是一次重要尝试&#xff0c;更是交通运输行业发展史中一个全新的起点 关注我&#xff0c;共同交流&#xff0c;一起成长 前言一、基本认识飞行汽车二、发展飞行汽车必要性三、飞行汽车所形成的影响 前言 2月27…

swoole

php是单线程。php是靠多进程来处理任务&#xff0c;任何后端语言都可以采用多进程处理方式。如我们常用的php-fpm进程管理器。线程与协程,大小的关系是进程>线程>协程,而我们所说的swoole让php实现了多线程,其实在这里来说,就是好比让php创建了多个进程,每个进程执行一条…

用云手机进行舆情监测有什么作用?

在信息爆炸的时代&#xff0c;舆情监测成为企业和政府决策的重要工具。通过结合云手机技术&#xff0c;舆情监测系统在品牌形象维护、市场竞争、产品研发、政府管理以及市场营销等方面发挥着关键作用&#xff0c;为用户提供更智能、高效的舆情解决方案。 1. 品牌形象维护与危机…

【数据结构】二、线性表:6.顺序表和链表的对比不同(从数据结构三要素讨论:逻辑结构、物理结构(存储结构)、数据运算(基本操作))

文章目录 6.对比&#xff1a;顺序表&链表6.1逻辑结构6.2物理结构&#xff08;存储结构&#xff09;6.2.1顺序表6.2.2链表 6.3数据运算&#xff08;基本操作&#xff09;6.3.1初始化6.3.2销毁表6.3.3插入、删除6.3.4查找 6.对比&#xff1a;顺序表&链表 6.1逻辑结构 顺…