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

news2024/11/15 1:29:55

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.coloradmin.cn/o/1490587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深圳五兴科技】Java面经

本文目录 写在前面试题总览1、java集合2、创建线程的方式3、对spring的理解4、Spring Boot 和传统 Spring 框架的一些区别5、springboot如何解决循环依赖6、对mybatis的理解7、缓存三兄弟8、接口响应慢的处理思路9、http的状态码 写在前面 关于这个专栏&#xff1a; 本专栏记录…

Python常用验证码标注和识别(需求分析和实现思路)

目录 一、需求分析 图像验证码识别&#xff1a; 文本验证码识别&#xff1a; 二、实现思路 三、案例与代码 四、总结与展望 在当今的数字时代&#xff0c;验证码&#xff08;CAPTCHA&#xff09;作为一种安全机制&#xff0c;广泛应用于网站和应用程序中&#xff0c;以防…

Python语言元素之变量

程序是指令的集合&#xff0c;写程序就是用指令控制计算机做我们想让它做的事情。那么&#xff0c;为什么要用Python语言来写程序呢&#xff1f;因为Python语言简单优雅&#xff0c;相比C、C、Java这样的编程语言&#xff0c;Python对初学者更加友好。 一、一些计算机常识 在…

二叉树——从中序与后序遍历序列构造二叉树、654. 最大二叉树、617. 合并二叉树

从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 在这里插入代码片 输入&#xff1a;inorder [9,3,15…

程序员如何面对金三银四

在当今数字化时代&#xff0c;程序员这个职业已经变得越来越受人们欢迎。随着互联网和信息技术的飞速发展&#xff0c;程序员的需求量也在不断增加。然而&#xff0c;尽管行业需求大&#xff0c;但想要在金三银四这个竞争激烈的时节找到一份满意的工作并不容易。那么&#xff0…

xss.haozi.me:0X0F

虽然是他把特殊字符给转了但是在HTML中是会转回去的所以是啥用 );alert(1

拿到年终奖马上离职,厚道吗?

拿到年终奖马上离职&#xff0c;厚道吗&#xff1f; 大家好&#xff0c;我是銘&#xff0c;全栈开发程序员。 今天在知乎上看到一个问题&#xff1a;拿到年终奖后马上辞职&#xff0c;厚道吗&#xff1f; image-20240229232132786 我的答案是&#xff1a;厚道&#xff0c;非常厚…

Java 小项目开发日记 06(Vue3 前端开发)

Java 小项目开发日记 06&#xff08;Vue3 前端开发&#xff09; 一、环境准备 1.1 创建vue工程(big-event-admin) npm init vuelatestcd big-event-admin npm install1.2 安装插件 1. 安装element-plus cnpm i element-plus --save2. 安装axios cnpm i axios3. 安装sass依赖…

判断给定数值x是否是NANmath.isnan(x)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断给定数值x是否是NAN math.isnan(x) [太阳]选择题 以下关于代码输出结果的说法中正确的是? import math import numpy as np print("【执行1】math.isnan(1.0)") print(math.is…

LeetCode:1976. 到达目的地的方案数(spfa + 记忆化 Java)

目录 1976. 到达目的地的方案数 原题链接 题目描述&#xff1a; 实现代码与解析&#xff1a; spfa 记忆化 原理思路&#xff1a; 1976. 到达目的地的方案数 原题链接 1976. 到达目的地的方案数 题目描述&#xff1a; 你在一个城市里&#xff0c;城市由 n 个路口组成&a…

企业级虚拟主播解决方案及制作流程

为满足企业对于高质量、高效率视频内容的需求&#xff0c;美摄科技推出了一款创新的虚拟主播解决方案。该方案结合先进的文字转视频技术和云端计算能力&#xff0c;帮助企业快速制作数字人视频&#xff0c;实现品牌宣传的多样化和个性化。 一、方案概述 美摄科技虚拟主播解决…

P-States/C-States/S-States/G-States/D-States

P-States是指处理器的性能状态&#xff0c;可以根据需要调整处理器的工作频率和电压来平衡性能和能效。 S-States是指系统的睡眠状态&#xff0c;可以让系统在空闲时进入低功耗状态以节省能量。 G-States是系统的全局状态&#xff0c;通常用于描述整个系统的运行状态。 C-St…

华为OD机试 - 数字排列 - 深度优先搜索dfs算法(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

代码随想录day13(1)栈与队列:用栈实现队列(leetcode232)

题目要求&#xff1a;使用栈实现push、pop、empty、peek&#xff08;返回队列首部元素&#xff09;。 思路&#xff1a;本题思路比较容易&#xff0c;即用两个栈模拟即可&#xff0c;pop时只需要先判断stackout栈是否为空&#xff0c;如果不空直接弹出&#xff0c;如果空就将s…

卷级实时备份的底层数据处理原理

一、任意时间点回退 实时备份数据&#xff0c;意味着备份数据和生产数据是时刻保持一致的状态&#xff0c;在这种情况下&#xff0c;要做到任意时间点回退恢复&#xff0c;需要借助特出的存储空间结构。 云祺在对目标卷进行实时备份时&#xff0c;在备份系统本地存放实时备份过…

迁移篇 | MatrixOne与MySQL全面对比

Part 1 迁移背景 Skyable 自研了物联网私有云平台用于 IoT 设备的数据上报和协议解析&#xff0c;由于管理设备数量的增加导致设备上报的数据量越来越大&#xff0c;架构中原使用的 MySQL 数据库&#xff08;分库分表&#xff09;的部分业务在对设备上报信息进行相关的查询时&…

《PyTorch深度学习实践》第十一讲卷积神经网络进阶

一、 1、卷积核超参数选择困难&#xff0c;自动找到卷积的最佳组合。 2、1x1卷积核&#xff0c;不同通道的信息融合。使用1x1卷积核虽然参数量增加了&#xff0c;但是能够显著的降低计算量(operations) 3、Inception Moudel由4个分支组成&#xff0c;要分清哪些是在Init里定义…

virsh 快速复制一个虚拟机

在很多测试环境中&#xff0c;想快速复制一个虚拟机&#xff0c;如何实现&#xff1f; 假如环境中已有一个虚拟机&#xff0c;查看虚拟机磁盘信息 # virsh domblklist hc1Target Source -------------------------------sda /data/vms/hc1.qcow2hda -复制一份镜像文…

初阶数据结构:排序(学习笔记)

目录 1. 各种排序算法的分类2. 插入排序2.1 直接插入排序2.2 希尔排序 3. 选择排序3.1 选择排序3.2 堆排序4. 交换排序4.1 冒泡排序4.2 快速排序4.2.1 霍尔法&#xff08;hoare&#xff09;4.2.2 挖坑法&#xff08;hole&#xff09;4.4.3 前后指针法4.4.4 补充&#xff1a;非递…

【项目管理】CMMI-质量保证过程

质量保证过程&#xff08;PQA)&#xff1a;通过质量保证活动&#xff0c;确保过程与产品满足过程、规程及相应的要求&#xff0c;确保问题得到关注与解决&#xff0c;使工作人员和管理者能够客观地了解过程与相关的工作产品。QA工程师应实施质量保证策划活动&#xff0c;客观地…