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

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

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

相关文章

RabbitMQ个人理解与基本使用

目录 一. 作用&#xff1a; 二. RabbitMQ的5中队列模式&#xff1a; 1. 简单模式 2. Work模式 3. 发布/订阅模式 4. 路由模式 5. 主题模式 三. 消息持久化&#xff1a; 消息过期时间 ACK应答 四. 同步接收和异步接收&#xff1a; 应用场景 五. 基本使用 &#xff…

网络工程师常用软件之配置对比软件

老王说网络&#xff1a;网络资源共享汇总 https://docs.qq.com/sheet/DWXZiSGxiaVhxYU1F ☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝ 我们经常在项目或者运维中对设备的config进行变更&am…

嵌入式驱动开发详解15(电容触摸屏gt9147)

文章目录 前言电容触摸屏特点MT触摸消息电容触摸屏协议电容屏触摸时序Type A 触摸点信息上报时序Type B 触摸点信息上报时序 多点触摸所使用到的API函数 驱动部分驱动框图设备树节点修改设备树引脚配置设备节点配置 具体驱动开发I2C驱动框架I2C框架内部实现 参考文献 前言 随着…

antdv-<a-button>中属性的使用

UI组件库&#xff08;User Interface Component Library&#xff09;是一种预先构建好的、可重用的用户界面元素集合&#xff0c;旨在帮助开发者更快速、更简便地构建用户界面。这些组件通常包括按钮、表单、导航栏、模态框等&#xff0c;能够提供一致的外观和交互风格&#xf…

win服务器的架设、windows server 2012 R2 系统的下载与安装使用

文章目录 windows server 2012 R2 系统的下载与安装使用1 windows server 2012 的下载2 打开 VMware 虚拟机软件&#xff08;1&#xff09;新建虚拟机&#xff08;2&#xff09;设置虚拟机&#xff08;3&#xff09;打开虚拟机 windows server 2012&#xff08;4&#xff09;进…

【ArcGIS微课1000例】0135:自动生成标识码(长度不变,前面自动加0)

文章目录 一、加载实验数据二、BSM计算方法一、加载实验数据 加载专栏《ArcGIS微课实验1000例(附数据)》配套数据中0135.rar中的建筑物数据,如下图所示: 打开属性表,BSM为数据库中要求的字段:以TD_T 1066-2021《不动产登记数据库标准》为例: 计算出来的BSM如下图: 二、B…

康谋方案 | 多源相机数据采集与算法集成测试方案

目录 一、相机组成 二、多源相机采集与测试方案 三、应用案例分享 四、结语 在智能化技术快速发展当下&#xff0c;图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进…

陪玩系统小程序源码/游戏陪玩APP系统用户端有哪些功能?游戏陪玩小程序APP源码开发

多客陪玩系统-游戏陪玩线下预约上门服务等陪玩圈子陪玩社区系统源码 陪玩系统源码&#xff0c;高质量的陪玩系统源码&#xff0c;游戏陪玩APP源码开发&#xff0c;语音陪玩源码搭建: 线上陪玩活动组局与线下家政服务系统的部署需要综合考虑技术选型、开发流程、部署流程、功能实…

运维实战:K8s 上的 Doris 高可用集群最佳实践

今天我们将深入探讨&#xff1a;&#xff1a;如何在 K8s 集群上部署 Compute storage coupled&#xff08;存算耦合&#xff09; 模式的 Doris 高可用集群&#xff1f; 本文&#xff0c;我将为您提供一份全面的实战指南&#xff0c;逐步引导您完成以下关键任务&#xff1a; 配…

从零用java实现 小红书 springboot vue uniapp (2)主页优化

前言 移动端演示 http://8.146.211.120:8081/#/ 前面的文章我们基本完成了主页的布局 今天我们具体的去进行实现 并且分享我开发时遇到的问题 首先先看效果 java仿小红书主页 实现效果为 1.顶端全屏切换 2.上划加载更多 3.下拉当前页整体刷新 顶端全屏切换我们选择 gui-switch…

动手学深度学习-线性神经网络-7softmax回归的简洁实现

目录 初始化模型参数 重新审视Softmax的实现 优化算法 训练 小结 在 线性回归的实现中&#xff0c; 我们发现通过深度学习框架的高级API能够使实现 线性回归变得更加容易。 同样&#xff0c;通过深度学习框架的高级API也能更方便地实现softmax回归模型。 本节如在上一节…

人工智能原理实验四:智能算法与机器学习

一、实验目的 本实验课程是计算机、智能、物联网等专业学生的一门专业课程&#xff0c;通过实验&#xff0c;帮助学生更好地掌握人工智能相关概念、技术、原理、应用等&#xff1b;通过实验提高学生编写实验报告、总结实验结果的能力&#xff1b;使学生对智能程序、智能算法等…

【新界面】基于卷积神经网络的垃圾分类(Matlab)

基于CNN的垃圾识别与分类GUI【新界面】 有需要可直接联系我&#xff0c;基本都在在线&#xff0c;能秒回&#xff01;可加我看演示视频&#xff0c;不懂可以远程教学 1.此项目设计包括两份完整的源代码&#xff0c;有GUI界面的代码和无GUI界面系统的代码。 &#xff08;以下部…

网站访问的基础-HTTP超文本传输协议

BS架构 浏览器Browser⬅➡服务器Server 浏览器和服务器之间通过 IP 地址进行通信&#xff0c;实现数据的请求和传输。 例如&#xff0c;当用户在浏览器中访问一个网站时&#xff0c;浏览器会根据用户输入的网址&#xff08;通过 DNS 解析得到服务器 IP 地址&#xff09;向服…

【C++】递归填充矩阵的理论解析与实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;问题描述&#x1f4af;递归实现&#x1f4af;参数解析函数参数详解填充顺序分析递归终止条件 &#x1f4af;示例解析第一层递归第二层递归第三层递归最终输出 &#x1f4af…

Git 仓库托管教程

git远程仓库 常用的远程仓库-->托管服务&#xff1a;github、码云、gitlab等 github需要魔法上网&#xff0c;速度较慢因为在国外且仅仅支持Git&#xff0c;如果不是Git项目是不支持的&#xff1b;码云--gitee国内的代码托管平台&#xff0c;服务器在国内速度快一些&#…

[创业之路-190]:《华为战略管理法-DSTE实战体系》-2-华为DSTE战略管理体系概要

目录 一、DSTE战略管理体系与BLM的关系 1、DSTE战略管理体系概述 2、BLM模型概述 3、DSTE与BLM的关系 二、重新认识流程 1. 流程就是业务本身&#xff0c;流程是业务过程的可视化&#xff1a; 2. 流程是业务最佳路径的经验教训总结&#xff1a; 3. 流程是战略知识资产、…

多智能体架构 Insight-V:针对长链视觉推理瓶颈

多智能体架构 Insight-V&#xff1a;针对长链视觉推理瓶颈 https://arxiv.org/abs/2411.14432 推理智能体与总结智能体协作完成任务&#xff0c;实现复杂视觉任务中的高效推理与总结。其中写了一小段&#xff0c;用迭代 DPO 算法&#xff0c;在每一轮训练中&#xff0c;模型会…

ASP.NET |日常开发中连接Oracle数据库详解

ASP.NET &#xff5c;日常开发中连接Oracle数据库详解 前言一、安装和配置 Oracle 数据访问组件1.1 安装ODP.NET&#xff08;Oracle Data Provider for.NET&#xff09;&#xff1a;1.2 引用相关程序集&#xff1a; 二、配置连接字符串2.1 连接字符串的基本组成部分&#xff1a…

生成树协议STP工作步骤

第一步&#xff1a;选择根桥 优先级比较&#xff1a;首先比较优先级&#xff0c;优先级值越小的是根桥MAC地址比较&#xff1a;如果优先级相同&#xff0c;则比较MAC地址。MAC地址小的是根桥。 MAC地址比较的时候从左往右&#xff0c;一位一位去比 第二步&#xff1a;所有非根…