【Python网络爬虫笔记】11- Xpath精准定位元素

news2024/12/15 10:30:39

目录

  • 一、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.coloradmin.cn/o/2259889.html

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

相关文章

Spark执行计划解析后是如何触发执行的?

在前一篇Spark SQL 执行计划解析源码分析中&#xff0c;笔者分析了Spark SQL 执行计划的解析&#xff0c;很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行&#xff0c;每个概念之间没有强烈的关联&#xff0c;因此这中间总感觉少了点…

java抽奖系统登录下(四)

6.4 关于登录 最简单的登录&#xff1a; 1、web登录页填写登录信息&#xff0c;前端发送登录信息到后端&#xff1b; 2、后端接受登录信息&#xff0c;并校验。校验成功&#xff0c;返回成功结果。 这种登录会出现一个问题&#xff0c;用户1成功登录之后&#xff0c;获取到后台…

基于米尔全志T527开发板的OpenCV进行手势识别方案

本文将介绍基于米尔电子MYD-LT527开发板&#xff08;米尔基于全志T527开发板&#xff09;的OpenCV手势识别方案测试。 摘自优秀创作者-小火苗 米尔基于全志T527开发板 一、软件环境安装 1.安装OpenCV sudo apt-get install libopencv-dev python3-opencv 2.安装pip sudo apt…

【传感器技术】第6章 压电式传感器,压电材料,压电效应,电压放大器

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

AI 智能体(AI Agent)到底什么原理?能干什么事情

智能体应用有哪些&#xff1f; 智能体在千行百业中有着广泛的应用&#xff0c;目前已经在 600 多个项目落地和探索&#xff0c;广泛应用于政府与公共事业、交通、工业、能源、金融、医疗、科研等行业。智能体是模拟人类智能的计算机系统&#xff0c;能自主感知环境、智能决策并…

力扣-图论-12【算法学习day.62】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

智慧政务数据中台建设及运营解决方案

数据中台&#xff1a;政府数字化转型的引擎 数据中台作为政府数字化转型的核心驱动力&#xff0c;起源于美军的作战体系&#xff0c;强调高效、灵活与强大。它不仅促进了政府决策的科学性&#xff0c;还推动了政府服务的精细化与智能化。 数据中台的应用场景&#xff1a;数字…

如何使mysql数据库ID从0开始编号——以BiCorpus为例

BiCorpus是北京语言大学韩林涛老师研制一款在线语料库网站&#xff0c;可以通过上传tmx文件&#xff0c;实现在线检索功能&#xff0c;程序在github上开源免费&#xff0c;深受广大网友的喜欢。 在使用过程中&#xff0c;我发现我上传的语言资产经历修改后&#xff0c;mysql的…

开启第二阶段---蓝桥杯

一、12.10--数据类型的范围及转化 今天是刚开始&#xff0c;一天一道题 对于这道题我想要记录的是Java中的整数默认是 int 类型&#xff0c;如果数值超出了 int 的范围&#xff0c;就会发生溢出错误。为了避免这个问题&#xff0c;可以将数字表示为 long 类型&#xff0c;方法…

使用 Database Tools 实现高效数据查询的十大 IntelliJ IDEA 快捷键

得益于 IntelliJ IDEA Ultimate 的 Database Tools&#xff08;数据库工具&#xff09;中的专用 SQL 查询控制台&#xff0c;您无需离开 IDE 即可轻松修改连接到您的 Java 应用程序的任何数据库中的数据&#xff0c;以及从这些数据库中提取数据。 查询控制台具有 SQL 语句特定的…

【蓝桥杯选拔赛真题93】Scratch青蛙过河 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析

目录 Scratch青蛙过河 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 Scr…

minio 分布式文件管理

一、minio 是什么&#xff1f; MinIO构建分布式文件系统&#xff0c;MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用&#xff0c;它兼容亚马逊 S3 云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数…

华为FreeBuds Pro 4丢了如何找回?(附查找功能使用方法)

华为FreeBuds Pro 4查找到底怎么用&#xff1f;华为FreeBuds Pro 4有星闪精确查找和离线查找&#xff0c;离线查找功能涵盖播放铃声、导航定位、星闪精确查找、上线通知、丢失模式、遗落提醒等。星闪精确查找是离线查找的子功能&#xff0c;当前仅华为FreeBuds Pro 4充电盒支持…

深度学习:基于MindSpore的极简风大模型微调

什么是PEFT&#xff1f;What is PEFT&#xff1f; PEFT(Parameter Efficient Fine-Tuning)是一系列让大规模预训练模型高效适应于新任务或新数据集的技术。 PEFT在保持大部分模型权重冻结&#xff0c;只修改或添加一小部份参数。这种方法极大得减少了计算量和存储开销&#x…

【一本通】最小圈

【一本通】最小圈 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 对于一张有向图&#xff0c;要你求图中最小圈的平均值最小是多少&#xff0c;即若一个圈经过k个节点&#xff0c;那么一个圈的平均值为圈上k条边权的和除以k&#xff0c;现要…

ansible自动化运维(四)jinjia2模板

Jinjia2模板 前面说到playbook组成的时候&#xff0c;有介绍到template模块&#xff0c;而template模块对模板文件进行渲染时&#xff0c;使用的就是jinja2模板引擎&#xff0c;jinja2本身就是基于python的模板引擎&#xff0c;所以下面先来了解一下jinjia2模板的一些用法 基…

【USB-HID】“自动化键盘“

这里写目录标题 【USB-HID】"自动化键盘"1. 前言2. 框架3. 实现3.1 模拟键盘按键输入 【USB-HID】“自动化键盘” 1. 前言 最近从朋友那了解了一种"自动化键盘"&#xff0c;能够通过上位机录制按键脚本&#xff0c;然后执行脚本&#xff0c;实现物理键盘…

使用ECK 快速部署 Elasticsearch 集群 + Kibana

部署 ECK [2.12] 安装说明 ElasticCloudonKubernetes(ECK)是一个 Elasticsearch Operator&#xff0c;但远不止于此。ECK 使用 Kubernetes Operator 模式构建而成&#xff0c;需要安装在您的 Kubernetes 集群内&#xff1b; 借助 Elastic Cloud on Kubernetes (ECK)&#xff0…

ruoyi Cannot find module ‘@/views/system/user/index‘

Cannot find module /views/system/user/index 删除node_module 后打包成功

从开始实现扩散概率模型 PyTorch 实现

目录 一、说明 二、从头开始实施 三、线性噪声调度器 四、时间嵌入 五、下层DownBlock类块 六、中间midBlock类块 七、UpBlock上层类块 八、UNet 架构 九、训练 十、采样 十一、配置&#xff08;Default.yaml&#xff09; 十二、数据集 (MNIST) keyword&#xff1a; Diffusion…