【Python网络爬虫笔记】11- Xpath精准定位元素
目录
- 一、Xpath 在 Python 网络爬虫中的作用
- (一)精准定位元素
- (二)应对动态网页
- (三)数据结构化提取
- 二、Xpath 的常用方法
- (一)节点选取
- (二)谓词筛选
- (三)轴操作
- 三、Xpath 在 Python 中的安装和使用
- (一)安装
- (二)使用 Xpath提取特定内容
- 四、Xpath 在 Python 网络爬虫中的典型案例
- (一)新闻网站数据抓取
- (二)电商产品信息抓取
Xpath,能够帮助开发者从复杂的网页结构中精准地提取所需信息。本文将深入探讨 Xpath 在 Python 网络爬虫中的作用、常用方法、安装与使用步骤以及典型案例。
一、Xpath 在 Python 网络爬虫中的作用
(一)精准定位元素
网页是由 HTML 标签构建而成的复杂层级结构,包含了大量的文本、图片、链接等信息。在进行网络爬虫时,我们往往只对特定的部分感兴趣,例如网页中的文章标题、正文内容、商品价格等。Xpath 提供了一种强大的语法,能够通过元素的路径、属性等特征,在整个网页结构中精确地定位到我们想要提取信息的元素,避免了对无关信息的抓取,大大提高了数据采集的准确性和效率。
例如:如果我们要获取必应首页热点新闻,可以直接找他的XPath。(调试工具中找到对应HTML标记,可以复制该span的XPath)

(二)应对动态网页
传统的基于 HTML 标签的解析方式可能难以获取这些动态加载的数据。而 Xpath 结合一些支持动态网页解析的库(如 Selenium),可以在页面加载完成后,仍然准确地定位到动态生成的元素,从而实现对动态网页数据的抓取,拓宽了网络爬虫的应用范围。
(三)数据结构化提取
网络爬虫的最终目的通常是将抓取到的数据进行整理和分析,以满足特定的业务需求。Xpath 可以将网页中的多个新闻标题和对应的发布时间分别提取并整理成一个数据列表,其中每个元素都是一个包含标题和时间的字典,方便后续的数据处理和存储。
二、Xpath 的常用方法
(一)节点选取
- 绝对路径选取:从根节点(通常是
html标签)开始,按照层级关系依次指定每个节点的标签名,直到找到目标节点。例如:/html/body/div[1]/div[2]/h1,表示从根节点html开始,依次进入body节点下的第一个div节点,再进入其下的第二个div节点,最后获取其中的h1节点。
注意:div[1]表示第1个div,XPath是从1开始的,不是从程序员的0开始的。 - 相对路径选取:以当前节点为参考点,使用一些特殊符号来表示相对位置关系。例如:
//h1,表示在整个文档中查找所有的h1节点;./div,表示在当前节点下查找所有的div节点;../p,表示在当前节点的父节点下查找所有的p节点。
(二)谓词筛选
谓词用于对选取的节点进行进一步的筛选,以满足特定的条件。谓词通常写在方括号 [] 内,紧跟在节点名称或路径后面。例://div[@class="article"],表示选取所有 class 属性值为 article 的 div 节点;//a[text()="点击这里"],表示选取文本内容为 “点击这里” 的 a 节点;//li[position()=3],表示选取第三个 li 节点。注意:一般把position省略,@后面接标记的属性,除了class,常用的还有id,超链接href
(三)轴操作
轴操作允许我们在文档树中沿着特定的轴(如祖先轴、子孙轴、兄弟轴等)来选取节点。例如://h2/ancestor::div,表示选取所有 h2 节点的祖先 div 节点;//ul/descendant::li,表示选取 ul 节点下的所有子孙 li 节点;//h3/following-sibling::p,表示选取所有与 h3 节点同级且在其后的 p 节点。轴操作在处理复杂的网页结构时非常有用,可以方便地获取与目标节点相关联的其他节点信息。
三、Xpath 在 Python 中的安装和使用
(一)安装
在 Python 中使用 Xpath,通常需要安装 lxml 库。可以使用 pip 命令进行安装,在命令行中执行以下命令:
pip install lxml
(二)使用 Xpath提取特定内容
以下示例,演示在 Python 中使用 Xpath 解析 HTML 页面中的标题和段落内容:
from lxml import etree# 假设已经获取到了网页的 HTML 内容,存储在变量 html 中
html = "<html><body><div class='container'><h1>标题</h1><p>这是一段正文内容。</p></div></body></html>"# 将 HTML 内容解析为 ElementTree 对象
tree = etree.HTML(html)# 使用 Xpath 选取标题元素并提取文本内容
title = tree.xpath("//h1/text()")[0]
print("标题:", title)# 选取正文段落元素并提取文本内容
paragraph = tree.xpath("//p/text()")[0]
print("正文:", paragraph)
运行结果:

在上述示例中,首先使用 etree.HTML 函数将 HTML 字符串解析为 ElementTree 对象,然后使用 xpath 方法传入 Xpath 表达式来选取相应的元素,并通过 text() 函数获取元素的文本内容。
四、Xpath 在 Python 网络爬虫中的典型案例
(一)新闻网站数据抓取
以某新闻网站为例,我们想要抓取该网站首页的新闻标题、发布时间和链接信息。网页结构如下:
<html><body><div class="news-list"><div class="news-item"><h2 class="news-title"><a href="news1.html">新闻标题 1</a></h2><span class="news-time">2024-12-10 10:00:00</span></div><div class="news-item"><h2 class="news-title"><a href="news2.html">新闻标题 2</a></h2><span class="news-time">2024-12-11 15:30:00</span></div><!-- 更多新闻项 --></div></body>
</html>
使用 Python 和 Xpath 实现数据抓取的代码如下:
import requests
from lxml import etree# 目标新闻网站首页 URL
url = "https://example.com/news"# 发送 GET 请求获取网页内容
response = requests.get(url)
html = response.text# 解析 HTML 内容
tree = etree.HTML(html)# 使用 Xpath 选取新闻标题、发布时间和链接
news_titles = tree.xpath("//div[@class='news-item']/h2[@class='news-title']/a/text()")
news_times = tree.xpath("//div[@class='news-item']/span[@class='news-time']/text()")
news_links = tree.xpath("//div[@class='news-item']/h2[@class='news-title']/a/@href")# 遍历并打印抓取到的数据
for i in range(len(news_titles)):print("标题:", news_titles[i])print("时间:", news_times[i])print("链接:", news_links[i])print("-" * 30)
运行结果:

在这个案例中,通过构造合适的 Xpath 表达式,分别选取了新闻标题、发布时间和链接元素,并将提取到的数据进行了打印输出。
(二)电商产品信息抓取
对于一个电商网站,我们希望抓取商品列表页面中的商品名称、价格和图片链接。假设网页结构如下:
<html><body><div class="product-list"><div class="product-item"><img src="product1.jpg" alt="商品图片 1"><h3 class="product-name">商品名称 1</h3><span class="product-price">¥99.99</span></div><div class="product-item"><img src="product2.jpg" alt="商品图片 2"><h3 class="product-name">商品名称 2</h3><span class="product-price">¥199.99</span></div><!-- 更多商品项 --></div></body>
</html>
以下是相应的 Python 代码:
# 导入相关库
from lxml import etree# 本地新闻网页文件路径
file_path = "goods.html"# 读取本地文件内容
with open(file_path, 'r', encoding='utf-8') as file:html = file.read()# 解析 HTML
tree = etree.HTML(html)# 提取商品名称、价格和图片链接
product_names = tree.xpath("//div[@class='product-item']/h3[@class='product-name']/text()")
product_prices = tree.xpath("//div[@class='product-item']/span[@class='product-price']/text()")
product_image_links = tree.xpath("//div[@class='product-item']/img/@src")# 展示抓取结果
for i in range(len(product_names)):print("商品名称:", product_names[i])print("价格:", product_prices[i])print("图片链接:", product_image_links[i])print("*" * 30)
运行结果:

综上所述,Xpath 在 Python 网络爬虫中扮演着至关重要的角色,它提供了强大而灵活的方式来定位和提取网页中的数据。
相关文章:
【Python网络爬虫笔记】11- Xpath精准定位元素
目录 一、Xpath 在 Python 网络爬虫中的作用(一)精准定位元素(二)应对动态网页(三)数据结构化提取 二、Xpath 的常用方法(一)节点选取(二)谓词筛选࿰…...
6.python列表
Python 列表 (List) 深度总结 文章目录 Python 列表 (List) 深度总结1. 列表的基本概念2. 访问列表中的元素3. 修改列表4. 删除列表元素5. 列表的操作符6. 列表的内置函数7. 列表的方法8. 列表的高级用法8.1 列表推导式 (List Comprehensions)8.2 列表的浅拷贝与深拷贝8.3 列表…...
Android中bindService和startService启动服务有何区别
Android中bindService和startService启动服务有何区别 bindService 和 startService 是 Android 中两种用于与 Service 交互的方式,它们的区别主要在于 生命周期管理 和 使用场景。以下是详细对比: 1. bindService方式 bindService 是一种绑定方式&am…...
超牛免费 机械臂模型、工业机器人模型下载网站集合
机械臂是一种高精度、多输入多输出的复杂系统,能够模仿人手的动作,按照给定程序、轨迹和要求实现自动抓取、搬运等功能。它通常由执行机构、驱动装置、控制系统以及传感器等组成,能够完成各种复杂的动作。 机械臂在工业、医学、娱乐、…...
引领未来的变革:15种前沿RAG技术及其应用探索
在现代人工智能领域,检索增强生成(RAG)技术逐渐成为推动各种应用的重要力量。这些技术通过结合信息检索与文本生成,能够更有效地处理和利用信息。本文将详细介绍15种前沿RAG技术及其具体应用实例,以帮助您更好地理解这…...
Scala泛型应用场景
Scala中的泛型(Generics)是一种强大的工具,允许开发者编写可重用的代码,同时保持类型安全。泛型在Scala中有多种应用场景,以下是一些常见的应用场景: 集合类: Scala的集合类(如List…...
AI监控赋能健身馆与游泳馆全方位守护,提升安全效率
一、AI视频监控技术的崛起 随着人工智能技术的不断发展,AI视频监控正成为各行业保障安全、提升效率的关键工具。相比传统监控系统,AI技术赋予监控系统实时分析、智能识别和精准预警的能力,让“被动监视”转变为“主动防控”。 二、AI监控应用…...
Avalonia实战实例二:添加三种状态的Svg图片按钮
文章目录 一、Avalonia和WPF中Style的不同1、Avalonia中舍弃了触发器2、Avalonia中Style不再使用x:Key命名区分二、使用Svg图片控件三、实现三种状态的按钮1、使用转换器2、伪类选择接着上一篇:使用Prism创建项目,并创建窗口 这一篇主要是添加: 两个Svg图片按钮,并包含三种…...
基于注意力的几何感知的深度学习对接模型 GAABind - 评测
GAABind 作者是苏州大学的生物基础与医学院, 期刊是 Briefings in Bioinformatics, 2024, 25(1), 1–14。GAABind 是一个基于注意力的几何感知蛋白-小分子结合模式与亲和力预测模型,可以捕捉小分子和蛋白的几何、拓扑结构特征以及相互作用。使用 PDBBind2020 和 CASF2016 作…...
arcGIS使用笔记(无人机tif合并、导出、去除黑边、重采样)
无人机航拍建图之后,通过大疆智图软件可以对所飞行的区域的进行拼图,但是如果需要对拼好的图再次合并,则需要利用到arcGIS软件。下面介绍arcGIS软件在这个过程中常用的操作。 1.导入tif文件并显示的方法:点击“”图标进行导入操作…...
Color-Light-Control-and-Four-Way-Responder based on STM32F103C8T6
Light Control and Responder 若要实现同样效果请看源码: gitee.com/apollo_666/Color-Light-Control-and-Four-Way-Responder # Abstract The design project for a decorative lighting controller enhanced our practical skills and engineering capabilities. During our…...
openGauss开源数据库实战二十八
文章目录 任务二十八 基于PowerDesigner的openGauss数据库设计任务目标实施步骤一、在Win11上安装 PowerDesigner16二、PowerDesigner快速入门1.启动和配置E-R概念建模2.创建数据项3.创建域4.创建实体5.创建两个实体之间的联系 三、PowerDesigner上的E-R建模1.只有单值属性的简…...
Vue3之响应式系统详解
Vue3中的响应式系统是其核心功能之一,它使得数据变化能够自动触发视图更新,从而简化了开发过程,提高了开发效率。本文将详细阐述Vue3中的响应式系统,包括其核心概念、工作原理、实现方式、应用场景以及优势。同时,本文…...
Kafka 的配置文件
broker.id1:为 broker 指定一个唯一的 ID。 listenersPLAINTEXT://x.x.x.x:xxx:指定 broker 监听的协议、IP 地址和端口。 num.network.threads3:指定用于处理网络请求的线程数。 num.io.threads8:指定用于 I/O 操作的线程数。…...
【系统思辨】分散注意
注意力在我们的日常生活和工作中扮演着至关重要的角色。注意力可以提高效率和准确性、减少错误和失误,提升学习效率,促进创造力。与此同时,各种各样的生活事件在分散我们的注意力,并且还有很多分散我们注意的手段,比如…...
单幅图像合成 360° 3D 场景的新方法:PanoDreamer,可同时生成全景图像和相应的深度信息。
论文介绍了一种从单幅图像合成 360 3D 场景的新方法。该方法以连贯的方式生成全景图及其相应的深度,解决了现有最先进方法(如 LucidDreamer 和 WonderJourney 的局限性。这些方法按照生成轨迹依次添加细节,通常在循环回输入图像时导致可见的接…...
Python课设-谁为影狂-豆瓣数据【数据获取与预处理课设】
🏆 作者简介:席万里 ⚡ 个人网站:https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。 🍻 对计算机充满兴趣,愿意并且希望学习更多的技…...
关卡选择与布局器
unity布局管理器 使用unity布局管理器轻松对关卡选择进行布局。 实现过程 准备普通按钮button设置字体和对应的sprite设置父gameobject(levelbase) 再创建UI.image(selectbackground)布局背景和大小gameobject(grid…...
评估一套呼叫中心大模型呼出机器人的投入回报比?
评估一套呼叫中心大模型呼出机器人的投入回报比? 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 评估一套呼叫中心大模型呼出机器人的投入回报比(ROI),是一个涉…...
面向对象的 CLI:使用 Fire 简化类和对象的方法暴露 (中英双语)
面向对象的 CLI:使用 Fire 简化类和对象的方法暴露 在传统的命令行工具开发中,argparse 是最常用的库之一,用于处理命令行参数和配置。它通常用于函数式编程,但在处理类和对象时,使用起来可能不如 Fire 方便。Fire 是…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
