Python网络爬虫-详解XPath匹配网页数据

news2025/1/11 2:44:39

前言


XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言。XPath使用路径表达式来选取XML文档中的节点或节点集。这些节点是通过沿着路径(path)或者步(steps)来选取的。XPath不仅可以用于搜寻XML文档,同样适用于HTML文档的搜索。

特点:

  1. 灵活性:XPath可以用于定位和选择XML文档中的任何节点,无论节点的层次结构如何复杂。它可以根据节点的名称、属性、位置等多种条件来进行选择。
  2. 简洁性:XPath的语法相对简单明了,路径表达式直观且易于理解。使用XPath可以很容易地定位到所需的节点,而无需编写复杂的代码。
  3. 强大性:XPath支持大部分的节点选择、轴定位和运算符操作,可以实现更加复杂和精确的节点筛选和处理。XPath还支持函数的使用,可以进行数值计算、字符串处理等操作。

XPath广泛应用于XML解析、XSLT转换、XPath查询等领域,是XML技术中的重要组成部分。它可以用于解析XML文档,并根据节点的层次结构和属性值来定位和选择节点。同时,XPath在各种编程语言中都有应用,如Java、Python、C#等,为开发者提供了灵活且强大的工具来操作和查询XML数据。也是爬虫最常用的工具。

XPath的基本语法

XPath 是一种在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。以下是一些 XPath 最常用的基本语法格式:

选择节点

  • 选择所有节点:/
  • 选择当前节点:.
  • 选择当前节点的父节点:..
  • 选择特定元素:/元素名 或 元素名
  • 选择特定属性的值:元素名/@属性名

选择多个节点

  • 通过逗号分隔来选择多个元素:元素1, 元素2, ...
  • 选择具有特定属性的元素:元素名[@属性名='属性值']

选择子节点

  • 选择直接子节点:父元素名/子元素名
  • 选择所有后代节点:父元素名//子元素名

选择特定位置的节点

  • 选择第一个子节点:父元素名/子元素名[1]
  • 选择最后一个子节点:父元素名/子元素名[last()]
  • 选择具有特定位置的子节点:父元素名/子元素名[位置]

基于条件选择节点

  • 选择满足特定条件的元素:元素名[条件]
  • 选择属性值满足特定条件的元素:元素名[@属性名=值]
  • 使用逻辑运算符组合条件:元素名[@属性1='值1' and @属性2='值2']

选择文本内容

  • 选择元素的文本内容:元素名/text()

选择属性和节点的组合

  • 选择元素及其属性的组合:元素名/@属性名, 元素名/子元素名

通配符

  • 选择所有元素:*
  • 选择具有特定属性的所有元素:*[@属性名='值']

具体表达式演示

选取节点: 

表达式描述
nodename选取此节点的所有子节点。
/从根节点选取(取子节点)。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。
.选取当前节点。
..选取当前节点的父节点。
@选取属性。

 常用的路径表达式及其结果:

路径表达式结果
bookstore选取 bookstore 元素的所有子节点。
/bookstore

选取根元素 bookstore。

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。

 谓语(Predicates):

路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]//title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点:

通配符描述
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。

  常用的路径表达式及其结果:

路径表达式结果
/bookstore/*选取 bookstore 元素的所有子元素。
//*选取文档中的所有元素。
//title[@*]选取所有带有属性的 title 元素。

选取若干路径:

路径表达式结果
//book/title | //book/price选取 book 元素的所有 title 和 price 元素。
//title | //price选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

基于Python库和数据源来实现XPath匹配和数据提取。

以下是使用lxmlBeautifulSoup、以及xml.etree.ElementTree(Python标准库)来获取数据的示例。

1. 使用 lxml

首先,我们创建一个XML文档并使用lxml来解析和提取数据。

from lxml import etree

# XML内容
xml_content = """
<bookstore>
    <book category="fiction">
        <title lang="en">Harry Potter</title>
        <author>J.K. Rowling</author>
    </book>
    <book category="biography">
        <title lang="en">Steve Jobs</title>
        <author>Walter Isaacson</author>
    </book>
</bookstore>
"""

# 解析XML
root = etree.fromstring(xml_content)

# 使用XPath提取数据
titles = root.xpath("//book/title/text()")
authors = root.xpath("//book/author/text()")

# 打印提取的数据
for title, author in zip(titles, authors):
    print(f"Title: {title}, Author: {author}")

执行结果:

 

2. 使用 BeautifulSoup

接下来,我们使用BeautifulSoup和CSS选择器(但是它与XPath非常相似)来解析HTML内容并提取数据。

from bs4 import BeautifulSoup

# HTML内容
html_content = """
<html>
    <body>
        <div class="book" category="fiction">
            <h2 class="title">Harry Potter</h2>
            <p class="author">J.K. Rowling</p>
        </div>
        <div class="book" category="biography">
            <h2 class="title">Steve Jobs</h2>
            <p class="author">Walter Isaacson</p>
        </div>
    </body>
</html>
"""

# 解析HTML
soup = BeautifulSoup(html_content, 'html.parser')

# 使用CSS选择器(与XPath类似)提取数据
titles = [title.text for title in soup.select(".book .title")]
authors = [author.text for author in soup.select(".book .author")]

# 打印提取的数据
for title, author in zip(titles, authors):
    print(f"Title: {title}, Author: {author}")

执行结果:

 

3. 使用 xml.etree.ElementTree

最后,我们使用Python的标准库xml.etree.ElementTree来解析XML并提取数据。

import xml.etree.ElementTree as ET

# XML内容
xml_content = """
<bookstore>
    <book category="fiction">
        <title lang="en">平凡的世界</title>
        <author>路遥</author>
    </book>
    <book category="biography">
        <title lang="en">老人与海</title>
        <author>海明威</author>
    </book>
</bookstore>
"""

# 解析XML
root = ET.fromstring(xml_content)

# 使用ElementTree提取数据
titles = [book.find('title').text for book in root.findall('book')]
authors = [book.find('author').text for book in root.findall('book')]

# 打印提取的数据
for title, author in zip(titles, authors):
    print(f"Title: {title}, Author: {author}")

 执行结果:

快速获取XPath数据格式

首先打开需要获取数据的网页:如下

快速获取网页的XPath数据格式有几种方法,这里主要介绍使用浏览器的开发者工具来自动生成XPath的方式。大多数现代浏览器都提供了开发者工具,其中包括XPath查询功能。

使用浏览器的开发者工具获取XPath

以下是使用浏览器的开发者工具快速获取网页XPath的步骤:

打开网页:首先打开你想要获取XPath的网页。

打开开发者工具

  • Chrome:右键点击网页上的元素,选择“检查”或使用快捷键Ctrl+Shift+ICmd+Option+I
  • Firefox:右键点击网页上的元素,选择“检查元素”或使用快捷键Ctrl+Shift+CCmd+Option+C
  • Safari:右键点击网页上的元素,选择“检查元素”或使用快捷键Cmd+Option+I

选择元素:在开发者工具的“元素”面板中,使用鼠标左键点击网页上的目标元素。

获取XPath

  • ChromeFirefox:在开发者工具的“元素”面板中,高亮显示的元素将在代码中自动选中。右键点击选中的代码行(通常是<tag><tag class="classname">),在上下文菜单中选择“复制” -> “复制XPath”。
  • Safari:在开发者工具的“元素”面板中,高亮显示的元素将在代码中自动选中。右键点击选中的代码行(通常是<tag><tag class="classname">),在上下文菜单中选择“复制” -> “XPath”。

 

通过以上步骤,你将快速获得网页元素的XPath表达式,然后可以将其用于自动化脚本或其他需要XPath的应用中。

要使用XPath获取网页数据,首先需要使用Python的HTTP库获取网页内容,然后使用XPath来解析和提取数据。以下是一个示例,我们将使用requests库获取网页内容,并使用lxml来解析和提取数据。

假设我们要获取的网页是https://www.baidu.com,我们想要获取XPath为/html/body/div[4]/div/div[2]/div/div[3]/div/h3[1]的元素内容。

首先,确保你已经安装了requestslxml库,如果没有,可以使用以下命令进行安装:

pip install requests lxml

 实现代码:

import requests
from lxml import etree

# 目标网页URL
url = 'https://www.baidu.com'

# 发送HTTP请求获取网页内容
response = requests.get(url)
response.raise_for_status()  # 如果HTTP请求返回了错误码,会抛出异常

# 使用lxml解析网页内容
html_content = response.text
tree = etree.HTML(html_content)

# 使用XPath提取数据
result = tree.xpath("/html/body/div[4]/div/div[2]/div/div[3]/div/h3[1]/text()")

# 打印提取的数据
if result:
    print("提取的数据:", result[0])
else:
    print("未找到匹配的数据")

 创作不易,感谢大家的三连哦!

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

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

相关文章

grafana报错This panel requires Angular (deprecated)

1.原因 报错解释&#xff1a; Grafana在更新到7.0版本后&#xff0c;弃用了AngularJS&#xff08;一种用于构建大型Web应用的JavaScript框架&#xff09;。在早期的Grafana版本中&#xff0c;某些面板可能依赖于AngularJS&#xff0c;但这种依赖已经逐步被新的React或Vue面板所…

[论文笔记] EcomGPT:COT扩充数据的电商大模型

社区供稿 | EcomGPT:基于任务链数据的电商大模型(附魔搭推理实践) - 知乎 https://arxiv.org/pdf/2312.15696.pdf EcomInstruct指令数据集构建 数据集组成 COT方式构造垂域训练数据:把原本的垂域任务分解成了原子任务,构造了基于解决原子任务的数据。这样能用类似…

更易使用,OceanBase开发者工具 ODC 4.2.4 版本升级

亲爱的朋友们&#xff0c;大家好&#xff01;我们的ODC&#xff08;OceanBase Developer Center &#xff09;再次迎来了重要的升级V 4.2.4&#xff0c;这次我们诚意满满&#xff0c;从五个方面为大家精心打造了一个更加易用、贴心&#xff0c;且功能更强的新版本&#xff0c;相…

网动统一通信平台(Active UC) downloadDocument.action 任意文件读取漏洞复现

0x01 产品简介 网动统一通信平台(Active UC) 是一个涵盖了多种通信功能的综合平台&#xff0c;通常包括文字、语音、视频通讯等功能&#xff0c;并且可能提供了一系列的通讯工具和服务。这样的平台通常旨在提升用户的沟通效率和便利性&#xff0c;为用户提供一个统一的通信环境…

探索未来的区块链DApp应用,畅享数字世界的无限可能

随着区块链技术的飞速发展&#xff0c;分布式应用&#xff08;DApp&#xff09;正成为数字经济中的一股强劲力量。DApp以其去中心化、透明公正的特点&#xff0c;为用户带来了全新的数字体验&#xff0c;开创了数字经济的新潮流。作为一家专业的区块链DApp应用开发公司&#xf…

服务器(AIX、Linux、UNIX)性能监视器工具【nmon】使用介绍

目录 ■nmon简介 1.安装 2.使用简介 3.使用&#xff08;具体使用的例子【CPU】【内存】&#xff09; 4.采集数据 5.查看log&#xff08;根据结果&#xff0c;生成报表&#xff09; 6.分析结果 ■nmon简介 nmon&#xff08;"Nigels performance Monitor"&…

贪吃蛇(C语言版)

在我们学习完C语言 和单链表知识点后 我们开始写个贪吃蛇的代码 目标&#xff1a;使用C语言在Windows环境的控制台模拟实现经典小游戏贪吃蛇 贪吃蛇代码实现的基本功能&#xff1a; 地图的绘制 蛇、食物的创建 蛇的状态&#xff08;正常 撞墙 撞到自己 正常退出&#xf…

IDEA pom.xml依赖警告

IDEA中&#xff0c;有时 pom.xml 中会出现如下提示&#xff1a; IDEA 2022.1 升级了检测易受攻击的 Maven 和 Gradle 依赖项&#xff0c;并建议修正&#xff0c;通过插件 Package Checker 捆绑到 IDE 中。 这并不是引用错误&#xff0c;不用担心。如果实在强迫症不想看到这个提…

pycharm远程连接server

1.工具–部署–配置 2.部署完成后&#xff0c;将现有的项目的解释器设置为ssh 解释器。实现在远端开发 解释器可以使用/usr/bin/python3

C#-使用Harmony库实现DLL文件反射调用

一. Harmony工作原理 利用C#运行时Runtime的反射机制,动态加载dll中的方法,字段,属性,实现对DLL方法的重写和代码注入。 二. Harmony下载及安装 1.下载Harmony_lib库lib.harmony.2.3.3.nupkg 霸王•吕布 / CSharpHarmonyLib GitCodehttps://gitcode.net/qq_35829452/csharph…

万界星空科技电机行业MES+商业电机行业开源MES+项目合作

要得出mes系统解决方案在机电行业的应用范围&#xff0c;我们先来看一下传统机电行业的管理难题&#xff1a; 1、 产品标准化程度较低&#xff0c;制造工艺复杂&#xff0c;生产周期较长&#xff0c;产品质量不稳定&#xff1b; 2、 自动化程度低&#xff0c;大多数工序以手工…

NAT的知识点和实现

1.NAT的作用&#xff1a; &#xff08;1&#xff09;、把内网私网IP转换公网IP&#xff1b; &#xff08;2&#xff09;、隐藏内网&#xff0c;起到保护内网作用&#xff1b; &#xff08;3&#xff09;、适当的缓解的IPv4地址空间枯竭&#xff1b; &#xff08;4&#xff…

SpringBoot学习之Kafka下载安装和启动【Windows版本】(三十四)

一、配置Java环境变量 打开CMD输入java -version检查java环境变量是否配置正确,如果配置正确在CMD窗口输入java -version应该输出如下: ​ 怎么配置Java环境变量这里我就不赘叙了,网上教程很多,请读者自行搜索操作。 二、下载Kafka 1、Kafka官网地址:Apache Kafka,…

vue项目使用百度地图

打开百度地图开放平台 百度地图开放平台 | 百度地图API SDK | 地图开发 在控制台新建应用 复制访问应用的ak 可修改地图样式 使用部分 <!-- 引入地图 --><div class"main-aside"><div id"b-map-container"></div></div> …

25计算机考研院校数据分析 | 复旦大学

复旦大学(fudan University)&#xff0c;简称"复旦”&#xff0c;位于中国上海&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;位列985工程、211工程、双一流A类&#xff0c;入选“珠峰计划"、"111计划""2011计划…

检索增强生成(RAG)技术

随着大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域的显著进步&#xff0c;它们在多个评估基准测试中显示出超越人类水平的语言和知识掌握能力。然而&#xff0c;这些模型在实际应用中也面临着一系列挑战&#xff0c;如制造事实、知识…

java实现解析html获取图片或视频url

一、前言 有时在实际项目中&#xff0c;比如发布某篇文章&#xff0c;需要取文章中的某张图片作为封面&#xff0c;那么此时需要文章内容&#xff0c;获取html内容中的图片地址作为封面&#xff0c;下面讲下如何获取html中的图片或视频地址。 二、实现 1.先定义一个工具类&…

深度解析:云计算的三宝——IaaS、PaaS和SaaS

4月22日&#xff0c;腾讯宣布旗下协作SaaS产品全面接入腾讯混元大模型&#xff0c;除去企业微信、腾讯会议、腾讯文档等“一门三杰”产品&#xff0c;腾讯乐享、腾讯电子签、腾讯问卷、腾讯云AI代码助手等协作SaaS产品也都已实现智能化升级。大模型应用落地再加速。 那么什么是…

【1646】医院人员管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 医院人员管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

面试八股——RabbitMQ

消息丢失问题 消息确认机制 生产者与MQ之间的消息确认&#xff1a; 当MQ成功接收消息后&#xff0c;会返回给生产者一个确认消息。如果在规定时间内生产者未收到确认消息&#xff0c;则任务消息发送失败。 MQ与消费者之间的消息确认&#xff1a; 当MQ成功接收消息后&#…