【Python从入门到进阶】28、xpath的安装以及使用

news2024/11/20 7:10:05

接上篇《27、Handler处理器使用及代理和Cookie登录实现》
上一篇我们讲解了urllib中Handler处理器的基本使用,以及实现代理访问和Cookie的登录。本篇我们来讲解HTML文档解析中的核心插件xpath的安装及使用。

一、xpath介绍

XPath是由W3C(World Wide Web Consortium)组织发布的。W3C是一个国际性组织,负责制定Web标准和推动Web技术的发展。XPath最初在1999年发布,并成为XML Path Language的一部分。它由James Clark提出并提交给W3C进行标准化,目的是为XML文档提供一种统一而强大的查询语言。

XPath是一种用于在XML文档中定位和提取数据的查询语言。它可以通过路径表达式来描述XML文档中的节点结构,并根据这些路径表达式来选择特定的节点或节点集合。XPath可用于查找元素、属性、文本和命名空间等信息,以及执行各种节点之间的关系操作。它广泛应用于Web抓取、数据提取、XML解析和XSLT转换等领域。
如下图例子就是通过xpath路径查询语言命中的一个页面上带有提交功能的登录按钮:

二、XPath在python爬虫中起到的作用

XPath在Python爬虫中起到了重要的作用。通过使用XPath,可以方便地定位和提取网页中的特定数据,从而实现网页内容的抓取和分析。

以下是XPath在Python爬虫中的主要作用:

1、定位元素:XPath可以通过路径表达式准确定位HTML或XML文档中的元素。这样,爬虫就可以精确地找到所需的数据所在的位置。
2、提取数据:XPath可以根据指定的路径表达式提取特定节点的文本、属性或标签等信息。通过使用XPath表达式,可以轻松地获取所需的数据,如标题、价格、日期等。
3、遍历结构:XPath可以遍历HTML或XML文档的节点结构,让爬虫能够顺序访问文档中的各个节点,并根据需要进行数据提取和处理。
4、过滤数据:XPath支持谓词(Predicate)语法,可以对节点进行条件过滤。这使得爬虫可以根据特定规则筛选所需的数据,例如只提取某个类别的商品或符合某个条件的新闻文章。
5、动态页面处理:许多网页采用动态加载的方式呈现数据,这对传统的基于正则表达式的爬虫来说可能较为困难。而XPath可以应对这种情况,因为它能够在解析前或解析后对文档进行动态的查询和处理。

综上所述,XPath在Python爬虫中充当了一个强大的工具,使得开发者可以更加灵活、准确地抓取和提取网页数据。它简化了数据提取过程,并提供了便捷的方式来处理各种复杂的网页结构和内容。

三、XPath相关匹配规则语法

XPath利用路径表达式来选择XML中的节点,从而实现对元素的定位。现在我们将先介绍一些与XPath相关的语法规则。
这里举一个HTML的例子,在下面语法讲解中,以该例子作为讲解语法的使用示例。

<?xml version="1.0" encoding="ISO-8859-1"?>

<studentList>

<student>
  <name lang="eng">Jack</title>
  <age>15</price>
</student>

<student>
  <name lang="eng">Tom</title>
  <age>20</price>
</student>

</studentList>

1、选取节点

XPath使用路径表达式在XML文档中选取节点。节点是通过沿着路径或者step来选取的。
下面列出了最有用的路径表达式:

【实例】
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

2、谓语(Predicates)

谓词用于过滤节点,只选择满足特定条件的节点。谓词通过方括号[]表示,并可以包含一系列条件表达式。

[@attribute='value']:选择具有特定属性值的节点。
[condition]:根据满足特定条件的节点来选择。

【实例】
在下面的表格中,列出了带有谓语的一些路径表达式,以及表达式的结果:

3、选取未知节点

XPath通配符可用来选取未知的XML元素。

【实例】
在下面的表格中,列出了一些路径表达式,以及这些表达式的结果:

4、选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
【实例】
在下面的表格中,列出了一些路径表达式,以及这些表达式的结果:

5、Axes(轴)

轴可定义相对于当前节点的节点集。

我们可以配合前面的路径(step),来获取XML文档中的复杂关系信息,语法为:

轴名称::节点测试[谓语]

【实例】

6、运算符

下面列出了可用在XPath表达式中的运算符:

7、函数

xpath支持一些关于数值、字符串、逻辑、时间等操作的函数,功能十分丰富,由于函数类型太多,这里不进行一一赘述,详见w3school对xpath的函数介绍:
https://www.w3school.com.cn/xpath/xpath_functions.asp
这里列举一下经常用到的xpath的字符串函数:

下面我们在浏览器中装好xpath插件就可以试验这些语法了。

四、浏览器安装xpath插件

1、xpath浏览器插件介绍

一些浏览器提供了支持XPath的插件或扩展,可以在浏览器中使用XPath进行网页内容的选择和操作。这些插件通常提供了一个XPath解析器,可以直接在浏览器的开发者工具或插件界面中执行XPath查询。
以下是一些常用的浏览器插件或扩展,用于支持XPath:

(1)Chrome浏览器:Chrome浏览器可以通过安装XPath Helper插件来支持XPath。XPath Helper提供了一个交互式的XPath查询编辑器,方便用户在网页上执行XPath查询,并显示匹配的结果。
(2)Firefox浏览器:Firefox浏览器可以通过安装Firebug插件或使用Firefox自带的开发者工具(控制台)来支持XPath。在开发者工具的控制台中,可以使用"$x()"函数执行XPath查询,并查看匹配的结果。
(3)Safari浏览器:Safari浏览器本身内置了支持XPath的开发者工具。在开发者工具的控制台中,可以使用"$x()"函数执行XPath查询,并查看匹配的结果。

我们接下来就以安装Chrome谷歌浏览器的XPath Helper插件为示例。

2、Chrome浏览器xpath安装

(1)插件下载网址:https://crxdl.com/,进入之后,搜索XPath Helper:

(2)找到自己下载的插件装包,解压.zip文件:

(3)再解压后的文件夹中找到 .CRX类型文件, 修改文件类型为 .rar文件:

(4)在修改文件名称后, 解压该 .rar压缩包, 得到文件夹:

(5)然后打开谷歌浏览器,打开右上角的"拓展程序",打开下面的"管理拓展程序", 进去后打开"开发者模式":

(6)下面把解压后的插件包直接拖进"拓展程序"里面,然后关闭浏览器再打开就可以使用插件:

(7)一些常用的插件建议固定(点亮图中的锥子),使用插件的时候直接点击下插件的图标, 插件使用结束推出的时候再点击下插件的图标:

点击插件出现小黑框后则意味着插件安装成功:

如何在浏览器中使用xpath呢?上面的小黑框分为两个区域,左边是QUERY的区域,右边是RESULTS的区域,分别代表查询编辑框和结果展示框。我们可以在右侧编写xptah语法来分析当前网页的HTML文档,右侧RESULTS区域会显示最终的分析结果,我们下面找几个示例测试一下。

【示例一】获取简书的文字列表
语法:

//div[@id="list-container"]/ul[@class="note-list"]/li//a[@class="title"]

结果:

【示例二】找到baidu首页的“百度一下”
语法:

//input[@id="su"]/@value

结果:

【示例三】获取今日头条置顶的新闻标题
语法:

//div[@class="main-content"]//a[@class="title stick-tag"]

结果:

五、python如何使用xpath

1、安装XPath解析库lxml

XPath本身并不需要安装,因为它是一种查询语言,而非具体的软件或工具。XPath通常会和其他编程语言或工具库结合使用,以解析和查询XML文档。以下是一般的步骤,用于在Python环境中使用XPath:

(1)安装Python:如果你还没有安装Python,请从Python官方网站(https://www.python.org)下载并安装Python解释器。

(2)安装XPath解析库:Python有多个XPath解析库可供选择,比如lxml和xml.etree.ElementTree。你可以使用pip命令来安装这些库。例如,使用以下命令安装lxml库:

pip install lxml

建议使用豆瓣源,下载比较快:

pip install lxml -i https://pypi.douban.com/simple

注:lxml库是基于C语言的libxml2和libxslt库,提供了高效且功能强大的解析、操作和生成XML/HTML的能力。

(3)导入XPath解析库:在Python代码中,通过导入相应的XPath解析库,使其可用于解析和查询XML文档。例如,在使用lxml库时,可以使用以下导入语句:

from lxml import etree

(4)使用XPath查询:使用XPath解析库lxml提供的查询方法,结合XPath表达式,对XML文档进行查询。

2、lxml.etree解析网页元素的步骤

使用lxml.etree来解析网页元素的一般步骤如下:
(1)导入模块:首先,需要导入lxml.etree库,并可能导入其他相关的模块,例如requests用于获取网页内容。以下是导入lxml.etree的示例代码:

from lxml import etree

(2)获取网页内容:使用适当的方法(如requests库)获取要解析的网页内容。例如,使用requests库发送GET请求并获取网页内容的示例代码如下:

import requests

url = "https://example.com"  # 要解析的网页URL
response = requests.get(url)  # 发送GET请求
html_content = response.text  # 获取网页内容

(3)创建解析器对象:使用lxml.etree模块中的etree.HTML()函数创建一个解析器对象,并将网页内容传递给它。这将返回一个可供后续查询和操作的ElementTree对象。以下是创建解析器对象的示例代码:

tree = etree.HTML(html_content)

如果需要解析本地的html文件,使用etree.parse方法:

tree = etree.parse('D:/pages/test.html')

(4)使用XPath进行查询:使用ElementTree对象的xpath()函数结合XPath表达式来查询特定的网页元素。xpath()函数将返回匹配XPath表达式的元素列表或单个元素。以下是使用XPath查询网页元素的示例代码:

elements = tree.xpath("//div[@class='content']")  # 查询所有class为'content'的div元素
for element in elements:
    # 处理每个匹配到的元素
    print(element.text)

在上述步骤中,etree.HTML()函数用于将HTML内容转换为ElementTree对象,而xpath()函数则用于执行XPath查询。其他常用的函数和方法还包括find()、findall()、get()、text属性等,它们可以根据需要用于获取特定元素的子元素、属性值或文本内容。

3、xpath解析实例

下面我们自己编写一个HTML,然后使用urllib+xpath,去解析HTML文档中的不同要求的内容。HTML页面代码如下:

首先我们要获取HTML页面的数据信息(被抓取样例.html):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
<ul>
    <li id="b1" class="c1">北京</li>
    <li id="b2">上海</li>
    <li id="c3">深圳</li>
    <li id="cb4">武汉</li>
</ul>
<ul>
    <li>大连</li>
    <li>锦州</li>
    <li>沈阳</li>
</ul>
</body>
</html>

然后我们有以下需求,大家可以动脑想一下,然后使用xpath来获取HTML文字中相应需求的数据,这里举了一些示例的分析需求及相应的语法:

# _*_ coding : utf-8 _*_
# @Time : 2023-07-13 15:08
# @Author : 光仔December
# @File : xpath解析样例
# @Project : Python基础

# 导入1xml.etree,需提前安装lxml库
# pip install lxml -i https://pypi.douban.com/simple
from lxml import etree

# 解析本地文件
html_tree = etree.parse('被抓取样例.html')

# 查找ul下面的li
li_list = html_tree.xpath('//ul/li')
print("1、查找ul下面的li:\n", li_list)
print("结果长度:", len(li_list))

# 查找所有有id的属性的li标签
# text()获取标签中的内容
li_list = html_tree.xpath('//ul/li[@id]/text()')
print("2、查找所有有id的属性的li标签:\n", li_list)

# 找到id为b1的li标 注意引号的问题
li_list = html_tree.xpath('//ul/li[@id="b1"]/text()')
print("3、找到id为b1的li标:\n", li_list)

# 查找到id为b1的li标签的class的属性值
li_list = html_tree.xpath('//ul/li[@id="b1"]/@class')
print("4、查找到id为b1的li标签的class的属性值:\n", li_list)

# 查询id中包合b的li标签
li_list = html_tree.xpath('//ul/li[contains(@id,"b")]/text()')
print("5、查询id中包合b的li标签:\n", li_list)

# 查询id的值以b开头的li标签
li_list = html_tree.xpath('//ul/li[starts-with(@id,"b")]/text()')
print("6、查询id的值以b开头的li标签:\n", li_list)

# 查询id为b1且class为c1的li标签
li_list = html_tree.xpath('//ul/li[@id="b1" and @class="c1"]/text()')
print("7、查询id为b1且class为c1的li标签:\n", li_list)

# 查询id为b1或id为b2的li标签
li_list = html_tree.xpath('//ul/li[@id="b1" or @id="b2"]/text()')
print("8、查询id为b1或id为b2的li标签:\n", li_list)

结果:

1、查找ul下面的li:
 [<Element li at 0x23ccaea35c0>, <Element li at 0x23ccaea3700>, <Element li at 0x23ccaea3a00>, <Element li at 0x23ccaea3640>, <Element li at 0x23ccaea3780>, <Element li at 0x23ccaea3940>, <Element li at 0x23ccaea3900>]
结果长度: 7
2、查找所有有id的属性的li标签:
 ['北京', '上海', '深圳', '武汉']
3、找到id为b1的li标:
 ['北京']
4、查找到id为b1的li标签的class的属性值:
 ['c1']
5、查询id中包合b的li标签:
 ['北京', '上海', '武汉']
6、查询id的值以b开头的li标签:
 ['北京', '上海']
7、查询id为b1且class为c1的li标签:
 ['北京']
8、查询id为b1或id为b2的li标签:
 ['北京', '上海']

请注意,上述步骤仅提供了一个基本的示例,并且可能需要根据具体的情况进行适当的调整和扩展。同时也可以参考lxml官方文档以获取更详细的信息和示例。

参考:尚硅谷Python爬虫教程小白零基础速通教学视频

转载请注明出处:https://blog.csdn.net/acmman/article/details/131705392

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

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

相关文章

kotlin中使用Room数据库(包含升降级崩溃处理)

目录 1.导入依赖库 2.数据实体类 3.数据访问对象 (DAO) 4.数据库类 5.调用DAO里面的“增、删、改、查”方法 6.数据库升降级处理 升级&#xff08;保存数据库历史数据&#xff09;&#xff1a; 升级&#xff08;不保存数据库历史数据&#xff09;&#xff1a; 降级&…

剑指 offer 数学算法题:数值的整数次方

题目描述&#xff1a; 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 分析&#xff1a; 直接计算法&#xff0c;通过判断 n 的正负&#xff0c;若为负数&#xff0c; x 即…

无法加载文件\venv\Scripts\Activate.ps1,因为在此系统上禁止运行脚本

一、问题发生 运行环境Windows 10、python 3.11.1、IDE VScode 当然你可能使用了其他IDE&#xff0c;例如pycharm等&#xff0c;不过没有关系解决问题的方法都是一致的。 报错信息如下图所示&#xff1a; actvivate.ps1这个脚本文件是用来激活python虚拟环境的。 其实&…

LabVIEW开发图像采集和图像处理程序

LabVIEW开发图像采集和图像处理程序 扫描电子显微镜&#xff08;SEM&#xff09;是一种功能强大的工具&#xff0c;广泛用于高分辨率的生物和半导体样品检测。然而&#xff0c;对于大面积或3D成像&#xff0c;SEM成像是一个耗时的过程。MBSEM旨在通过同时扫描多个像素来减少采…

spring5源码篇(10)——spring-aop代理过程

spring-framework 版本&#xff1a;v5.3.19 文章目录 1、ProxyFactory1.1、createAopProxy() 创建AopProxy1.2、getProxy() 创建代理对象1.3、JdkDynamicAopProxy#invoke 代理逻辑1.3.1、advised.getInterceptorsAndDynamicInterceptionAdvice() 匹配添加的advisor并转化成所需…

集群基础3——haproxy负载均衡apache

文章目录 一、环境说明二、安装配置httpd三、安装配置haproxy四、验证http负载均衡五、配置https负载均衡六、haproxy网页监控6.1 监控参数详解6.2 页面操作 一、环境说明 使用haproxy对apache进行负载均衡。 主机IP角色安装服务真实IP&#xff1a;192.168.161.129VIP&#xff…

通识强化学习,初步了解强化学习的运行规则和估值方法

1.强化学习的发展及应用现状 1.1.强化学习的由来 目前&#xff0c;大家认为强化学习&#xff08;Reinforcement Learning, RL&#xff09;的来源与两个领域密切相关&#xff1a;即心理学的动物试错学习和最优控制的优化理论。 这里都是有相应的共性的&#xff0c;在environme…

PostgreSQL MVCC的弊端优化方案

我们之前的博客文章“我们最讨厌的 PostgreSQL 部分”讨论了大家最喜欢的 DBMS 多版本并发控制 (MVCC) 实现所带来的问题。其中包括版本复制、表膨胀、索引维护和真空管理。本文将探讨针对每个问题优化 PostgreSQL 的方法。 尽管 PostgreSQL 的 MVCC 实现是 Oracle 和 MySQL 等…

java每日一题:HashMap的工作原理

面试官&#xff1a;欢迎参加我们的面试。请你解释一下Java中HashMap的工作原理。&#x1f60a; 面试者&#xff1a;HashMap是一种基于哈希表的数据结构&#xff0c;它可以存储键值对。在HashMap内部&#xff0c;使用一个数组来存储数据&#xff0c;数组中的每个位置被称为桶&a…

生信分析案例 Python简明教程 | 视频11

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

C语言之每日一题——杨氏矩阵

今天分享的是杨氏矩阵&#xff0c;题目不是特别难&#xff0c;但是是一道比较考验你对杨氏矩阵的理解&#xff0c;要是你不知道杨氏矩阵的话&#xff0c;那你这道题目就无从下手 杨氏矩阵我们可以这样理解&#xff0c;首先矩阵二字证明他是一个长方形型或者正方形的数组&#x…

【HarmonyOS】元服务隐私协议开发指导样例

【关键字】 隐私、弹窗、元服务、协议 【介绍】 每个元服务必须提供隐私声明&#xff0c;否则将导致提交元服务发布上架时&#xff0c;审核无法通过。隐私声明的具体要求请参见隐私声明规范。用户使用元服务前&#xff0c;必须引导其了解隐私声明信息&#xff0c;获取用户授权…

3.SpringBoot 返回Html界面

1.添加依赖spring-boot-starter-web <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>2.创建Html界面 在Resources/static 文件夹下面建立对应的html&#xff0c…

【亮点回顾】第四届国有企业数智化采购与智慧供应链论坛

7月12日&#xff0c;由中国物流与采购联合会主办、北京筑龙承办的“第四届国有企业数智化采购与智慧供应链论坛”在北京市盛大举行。本届论坛以“数智赋能创新发展”为主题&#xff0c;立足于国有企业采购领域发展前沿&#xff0c;深度聚焦国有企业如何在数字经济发展中发挥引领…

【uView 1.x】中国省市县/区 地区选择器picker【亲测可用】

如果你还没安装uView&#xff0c;请先安装uView 注意&#xff1a;这是uView1.x Picker选择器的用法&#xff0c;uView2.x Picker选择器中没有mode属性 效果图&#xff1a; 把u-picker的mode设置为region地区模式&#xff0c;然后展示在u-input中。 由于uview中自带城市数据包…

echart折线图背景颜色自定义,实心圆点,虚线网格等功能

需求&#xff1a;根据传入的值对背景进行分层颜色展示&#xff0c;比如y轴20-40区间颜色为蓝色&#xff0c;40-50为红色这种&#xff0c;折线图的小圆点设置为实现&#xff0c;实现缩放功能 1.效果如下 2.代码讲解如下 首先下载echarts npm install echarts4.9.0 -S 我这边…

LeetCode·每日一题·931. 下降路径最小和·记忆化搜索

作者&#xff1a;小迅 链接&#xff1a;https://leetcode.cn/problems/minimum-falling-path-sum/solutions/2341965/ji-yi-hua-sou-suo-zhu-shi-chao-ji-xiang-3n58v/ 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 著作权归作者所有。商业转载请联系作者获得授权&am…

Mysql单表多表查询练习

题目要求&#xff1a; 1.查询student表的所有记录 2.查询student表的第2到4条记录 3.从student表查询所有的学生的学号&#xff08;id&#xff09;&#xff0c;姓名&#xff08;name&#xff09;&#xff0c;和院系&#xff08;department&#xff09;的信息 4.从student表…

LeetCode 75 第一题(1768)交替合并字符串

题目: 示例: 分析: 这是LeetCode75 的第一道题目,是一道简单题,题目没那么复杂,就是给两个字符串,要这两个字符串你出一个字符我出一个字符来拼凑出一个新的字符串,如果其中一个字符串用完了则剩下部分全部由另一个字符串出. 我们可以使用两个指针分别指向word1和word2: str…

【hadoop】部署hadoop全分布模式

hadoop全分布模式 全分布模式特点部署全分布模式准备工作正式配置hadoop-env.shhdfs-site.xmlcore-site.xmlmapred-site.xmlyarn-site.xmlslaves对NameNode进行格式化复制到另外两台虚拟机启动 对部署是否成功进行测试 全分布模式特点 真正的分布式环境&#xff0c;用于生产具…