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

前言


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("未找到匹配的数据")

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从0到1—POC编写基础篇(一)

POC编写基础篇 POC的概念 在网络安全领域中&#xff0c;POC的概念是指"Proof of Concept"&#xff0c;也被称为"攻击验证"。它是指安全研究人员或黑客用来证明某个漏洞、弱点或安全问题存在的实证或演示。 网络安全研究人员经常通过开发POC来展示一个漏洞的…

【Node.js】03 —— HTTP 模块探索

&#x1f31f;Node.js之HTTP模块探索✨ &#x1f31f;引言 在网络编程中&#xff0c;HTTP协议无处不在。在Node.js的世界里&#xff0c;我们可以通过内置的http模块来轻松创建HTTP服务器和客户端&#xff0c;实现数据的接收和发送。今天就让我们一起打开这扇门&#xff0c;探索…

SpringBoot + kotlin 协程小记

前言&#xff1a; Kotlin 协程是基于 Coroutine 实现的&#xff0c;其设计目的是简化异步编程。协程提供了一种方式&#xff0c;可以在一个线程上写起来像是在多个线程中执行。 协程的基本概念&#xff1a; 协程是轻量级的&#xff0c;不会创建新的线程。 协程会挂起当前的协…

MATLAB 数据类型

MATLAB 数据类型 MATLAB 不需要任何类型声明或维度语句。每当 MATLAB 遇到一个新的变量名&#xff0c;它就创建变量并分配适当的内存空间。 如果变量已经存在&#xff0c;那么MATLAB将用新内容替换原始内容&#xff0c;并在必要时分配新的存储空间。 例如&#xff0c; Tota…

CentOS-7安装grafana

一、通用设置&#xff08;分别在4台虚拟机设置&#xff09; 1、配置主机名 hostnamectl set-hostname --static 主机名2、修改hosts文件 vim /etc/hosts 输入&#xff1a; 192.168.15.129 master 192.168.15.133 node1 192.168.15.134 node2 192.168.15.136 node33、 保持服…

(Oracle)SQL优化案例:组合索引优化

项目场景 项目上的ETL模型里有如下SQL语句。执行速度非常慢&#xff0c;每次只查询200条数据&#xff0c;但却需要20多秒的时间。再加上该SQL查询出的数据同步频率很高&#xff0c;这个速度是完全不能忍受的。 因为项目隐私&#xff0c;所以对表及字段做了改写。 SELECT ID…

SVN小乌龟汉化问题

1.首先确认中文语言包和SVN版本需要一致&#xff08;点击右键 选择最后一个选项即可查看&#xff09; 官网链接 点击这个官网链接可以下载对应版本的中文包 2.下载好之后直接无脑下一步安装即可 3.如果还是没有中文&#xff0c;找到这个文件夹&#xff0c;把里面的内容全部删…

SpaceX的核心Fact Sheet

首先给大家分享一组SpaceX的关键数据&#xff0c;让大家对这个神秘公司有个定量认知&#xff1a; 2024年SpaceX预计收入可达130亿美金&#xff0c;同比增长54%&#xff0c;预计2035年可达1000亿美金 SpaceX目前已经处于盈利状态&#xff0c;具体利润规模未知 SpaceX的发射成本…

Kotlin语法入门-类与对象(6)

Kotlin语法入门-类与对象(6) 文章目录 Kotlin语法入门-类与对象(6)六、类与对象1、声明和调用2、get和set3、init函数初始化4、constructor构造函数4.1、主构造函数4.2、二级构造函数4.3、多个构造函数4.4、省略主构造函数并写了次构造函数 5、类的继承与重写5.1、继承5.2、继承…

每天五分钟计算机视觉:基于YOLO算法精确分类定位图片中的对象

滑动窗口的卷积的问题 滑动窗口的卷积实现效率很高,但是它依然不能够输出最精准的边界框,比如下面所示: 我们可以看到蓝色框不论在什么位置都不能很好的确定车的位置,有一个算法是YOLO 算法它能够帮助我们解决这个问题。 YOLO 算法 比如我们的输入图像是100*100,我们会…

TCP相关问题总结

文章目录 TCP连接建立过程1. TCP三次握手2. TCP四次挥手3. TCP为什么是三次握手4. TCP为什么是四次挥手 TCP流量控制TCP拥塞控制1. 为什么需要拥塞控制2. 控制手段 TCP连接建立过程中出现丢包 TCP连接建立过程 1. TCP三次握手 首先client端发出连接请求&#xff0c;并且请求同…

在 VSCode 中运行 C#

文章目录 1.为何选择VSCode而不是VS2.操作步骤2.1 安装.NET2.2 安装扩展插件2.2.1 C#2.2.2 Code Runner 3.新建工程HelloCsharp 1.为何选择VSCode而不是VS VS实在是太“重”了&#xff0c;如果只是写一些简单控制台程序进行调试&#xff0c;则完全没必要 2.操作步骤 2.1 安装…

线性代数 --- 矩阵的对角化以及矩阵的n次幂

矩阵的对角化以及矩阵的n次幂 &#xff08;特征向量与特征值的应用&#xff09; 前言&#xff1a; 在上一篇文章中&#xff0c;我记录了学习矩阵的特征向量和特征值的学习笔记&#xff0c;所关注的是那些矩阵A作用于向量x后&#xff0c;方向不发生改变的x(仅有尺度的缩放)。线…

iOS - 多线程-GCD-队列组

文章目录 iOS - 多线程-GCD-队列组1. 队列组1.1 基本使用步骤 iOS - 多线程-GCD-队列组 开发过程中&#xff0c;有时候想实现这样的效果 多个任务并发执行所有任务执行完成后&#xff0c;进行下一步处理&#xff08;比如回到主线程刷新UI&#xff09; 1. 队列组 可以使用GC…

探索亚马逊云科技「生成式 AI 精英速成计划」

目录 前言「生成式 AI 精英速成计划」技术开发课程学习课程学习 总结 前言 亚马逊云科技&#xff08;Amazon Web Services&#xff0c;简称AWS&#xff09;作为全球领先的云计算服务提供商&#xff0c;一直以来在推动人工智能&#xff08;AI&#xff09;领域的发展中扮演着重要…

调度问题变形的贪心算法分析与实现

调度问题变形的贪心算法分析与实现 一、问题背景与算法描述二、算法正确性证明三、算法实现与分析四、结论 一、问题背景与算法描述 带截止时间和惩罚的单位时间任务调度问题是一个典型的贪心算法应用场景。该问题的目标是最小化超过截止时间导致的惩罚总和。给定一组单位时间…

element plus:tree拖动节点交换位置和改变层级

图层list里有各种组件&#xff0c;用element plus的tree来渲染&#xff0c;可以把图片等组件到面板里&#xff0c;面板是容器&#xff0c;非容器组件&#xff0c;比如图片、文本等&#xff0c;就不能让其他组件拖进来。 主要在于allow-drop属性的回调函数编写&#xff0c;要理清…

毕业撒花 流感服务小程序的设计与实现

目录 1.1 总体页面设计 1.1.1 用户首页 1.1.2 新闻页面 1.1.3 我的页面 1.1.5 管理员登陆页面 1.1.6 管理员首页 1.2 用户模块 1.2.1 体检预约功能 1.2.2 体检报告功能 1.2.4 流感数据可视化功能 1.2.5 知识科普功能 1.2.6 疾病判断功能 1.2.7 出示个人就诊码功能 …

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

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

Elasticsearch集群部署(Linux)

1. 准备环境 这里准备三台Linux虚拟机&#xff0c;用于配置Elasticsearch集群和部署可视化工具Kibana。 角色IP域名集群名称节点名称版本操作系统ES192.168.243.100linux100cluster-eses-node-1007.12.0CentOS 7192.168.243.101linux101cluster-eses-node-101192.168.243.102…