【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 属性值为 articlediv 节点;//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 网络爬虫中扮演着至关重要的角色,它提供了强大而灵活的方式来定位和提取网页中的数据。

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

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

相关文章

【数字花园】个人知识库网站搭建:①netlify免费搭建数字花园

目录 [[数字花园]]的构建原理包括三个步骤&#xff1a;五个部署方案教程相关教程使用的平台 步骤信息管理 这里记录的自己搭建数字花园&#xff08;在线个人知识库&#xff09;的经历&#xff0c;首先尝试的是网上普遍使用的方法&#xff0c;也就是本篇文章介绍的。 后面会继续…

【0x000C】HCI_Link_Key_Request_Negative_Reply 命令详解

目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Link_Key_Request_Negative_Reply命令格式 2.2. BD_ADDR 三、返回事件及参数 3.1. 生成的事件 3.2. BD_ADDR 2.3. Status 四、命令执行流程场景 4.1. 命令触发条件 4.2. 命令组装与发送 4.3. 控制器接收与处理 …

数字产业化和产业数字化到底是什么?

“数字产业化”和“产业数字化”在很多官方文件和领导人讲话中都是成对出现的&#xff0c;这两个术语看起来非常相似&#xff0c;但它们作为数字经济的两个重要组成部分&#xff0c;既有联系又有区别。 在谈数字产业化和产业数字化之前&#xff0c;我这里需要先给大家介绍一个概…

npm或yarn包配置地址源

三种方法 1.配置.npmrc 文件 在更目录新增.npmrc文件 然后写入需要访问的包的地址 2.直接yarn.lock文件里面修改地址 简单粗暴 3.yarn install 的时候添加参数 设置包的仓库地址 yarn config set registry https://registry.yarnpkg.com 安装&#xff1a;yarn install 注意…

文件上传之黑名单检测

一般情况下&#xff0c;代码文件里会有一个数组或者列表&#xff0c;该数组或者列表里会包含一些非法的字符或者字符串&#xff0c;当数据包中含有符合该列表的字符串时&#xff0c;即认定该数据包是非法的。 ​​ 一.如何判断是否为黑名单检测 黑名单是有限的&#xff0c;可以…

光控资本:锂电排产上行 AI手机有望快速渗透

AI手机有望快速渗透 据赛迪参谋猜想&#xff0c;2024年AI手机的出货量估量将会抵达1.5亿部&#xff0c;占全球智能手机总出货量13%&#xff0c;到2027年&#xff0c;全球AI手机销售量有望跨过5.9亿部&#xff0c;占全球智能手机总出货量的比重跨过50%。 跟着硬件根底夯实、端侧…

el-table 动态计算合并行

原始表格及代码 <el-table:data"tableData"class"myTable"header-row-class-name"tableHead" ><el-table-column prop"date" label"日期"> </el-table-column><el-table-column prop"name" …

druid.properties图标是齿轮

一、问题 在IDEA中&#xff0c; druid.properties图标是齿轮 二、原因 2023版本开始&#xff0c;IDEA新的UI的问题 三、解决方法 1、点击右上角的齿轮图标 2、点击Settings 3、Appearance & Behavior---->New UI---->取消勾选“Enable new UI”---->右下角OK 4…

龙海家园地面停车场探寻2

在南山前海上班2年多了&#xff0c;到现在最喜欢的小区还是龙海家园小区。龙海家园小区是深圳目前最大的公共保障性租赁住房小区,目前居住有约2.6万人。而小区的停车位是远远不够的。之前一直很好奇车子可以停哪里。 后面加班之余经常去小区吃饭和转转。发现龙海家园小区与对面…

群控系统服务端开发模式-应用开发-操作记录功能开发

一、开放路由 在根目录下route文件夹下修改app.php文件&#xff0c;代码如下&#xff1a; // 操作日志Route::get(token/get_list,permission.Token/getList);// 获取操作日志列表Route::post(token/get_all,permission.Token/getAll);// 获取操作日志所有数据Route::post(toke…

探索 HTTP 请求头中的 “Host” 字段及其安全风险

探索 HTTP 请求头中的 “Host” 字段及其安全风险 大家好&#xff0c;今天我们来聊聊 HTTP 请求头中的“Host”字段&#xff0c;以及它的使用方法和安全风险。 什么是Host字段 在 HTTP 请求头中&#xff0c;“Host”字段是一个至关重要的部分。它告诉服务器&#xff0c;我们…

Type-C接口电热毯的创新之旅

在科技日新月异的今天&#xff0c;智能家居产品正逐步渗透到我们生活的每一个角落&#xff0c;从智能灯光到温控系统&#xff0c;无一不展现着科技带来的便捷与舒适。而在这个追求高效与智能化的浪潮中&#xff0c;一款结合了最新科技元素的电热毯——Type-C接口电热毯&#xf…

计算机网络知识点全梳理(一.TCP/IP网络模型)

目录 TCP/IP网络模型概述 应用层 什么是应用层 应用层功能 应用层协议 传输层 什么是传输层 传输层功能 传输层协议 网络层 什么是网络层 网络层功能 网络层协议 数据链路层 什么是数据链路层 数据链路层功能 物理层 物理层的概念和功能 TCP/IP网络模型概述…

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作&#xff0c;以控制用户对数据库的访问权限。通过账户管理&#xff0c;可以设置用户名、密码、主机地址等信息&#xff0c;确保数据库的安全性和可控性。例如&#xff0c;使用 CREATE USER 创建用户&#xff0c;ALTER…

SpringSecurity使用教程

一、基本使用 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;专门设计用于保护基于 Spring 的应用程序。它不仅提供了全面的安全服务&#xff0c;还与 Spring 框架及其生态系统&#xff08;如 Spring Boot、Spring MVC 等&#xff09;紧密集…

docker 安装mysql 5.7 详细保姆级教程

1. 安装mysql(5.7) docker pull mysql:5.7 若是拉取不了&#xff0c;可以配置下 docker 源 2. 查看是否安装成功 docker images 下图就是成功了 3.创建mysql专用目录、数据挂载目录、配置文件目录 &#xff0c;演示目录在于/home/下 //命令逐条执行cd /home/ mkdir mysql …

fixture装饰器

普通代码案例&#xff1a; python本身执行 import pytestdef init_new():print("init_new...")return Truedef test_case(init_new):if init_new is True:print("如果init_new返回True&#xff0c;就执行用例test_case")if __name__ __main__:#用python本…

【韩顺平Java JDBC学习笔记】

Java JDBC 文章目录 jdbc概述基本介绍jdbc原理示意图 jdbc快速入门JDBC程序编写步骤获取数据库连接5种方式ResultSet[结果集]SQL注入Statement PreparedStatement预处理好处基本使用 JDBC APIJDBCUtils工具类使用工具类 事务基本介绍应用实例模拟经典的转帐业务 - 未使用事务模…

KeepAlive与RouterView缓存

参考 vue动态组件&#xff1c;Component&#xff1e;与&#xff1c;KeepAlive&#xff1e; KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…