当前位置: 首页 > news >正文

BeautifulSoup 与 XPath 用法详解与对比

BeautifulSoup(bs4)XPath 是学习python爬虫过程中常常用到的库,本文将详细介绍它们的功能、使用方法、优缺点以及实际应用中的区别和选择建议。


1. BeautifulSoup 用法详解

1.1 什么是 BeautifulSoup?

BeautifulSoup 是 Python 中用于解析 HTML 和 XML 的库。它提供了简单易用的接口,可以高效地提取网页中的标签、内容以及属性。常配合 requests 库使用,用于静态网页的数据爬取。

安装
pip install beautifulsoup4 lxml
加载 HTML 文档
from bs4 import BeautifulSoup
import requestsurl = "https://example.com"
response = requests.get(url)
page_text = response.text# 使用 lxml 解析器加载 HTML
soup = BeautifulSoup(page_text, 'lxml')

1.2 定位元素

BeautifulSoup 提供多种方式来定位 HTML 文档中的元素。

1.2.1 标签定位

根据标签名和属性查找元素:

# 找到第一个符合条件的 div 标签
tag = soup.find('div', class_='example')# 找到所有符合条件的 div 标签
tags = soup.find_all('div', class_='example')# 查找特定属性的标签
tag = soup.find('meta', attrs={'name': 'description'})
1.2.2 CSS 选择器定位

通过 CSS 选择器查找元素:

# 根据 ID 定位
tag = soup.select('#header')# 根据类名定位
tags = soup.select('.menu-item')# 层级关系
tags = soup.select('div > p')  # 直接子元素
tags = soup.select('div p')    # 所有子孙元素

1.3 提取内容与属性

提取标签中的文本内容或属性值:

  • 提取文本内容

    • tag.string:提取当前标签的直系文本。
    • tag.text:提取当前标签及其子标签的所有文本。
  • 提取属性值

    • 使用 tag['属性名'] 获取属性值。
tag = soup.find('img', class_='image')
# 提取文本
text = tag.text
# 提取图片链接
src = tag['src']

2. XPath 用法详解

2.1 什么是 XPath?

XPath 是一种基于路径的语言,用于在 HTML 和 XML 中定位节点或提取数据。它更适合复杂的结构化页面,能够高效处理多条件的筛选和属性提取。

安装

XPath 通常通过 lxml 实现:

pip install lxml
加载 HTML 文档
from lxml import etree
import requestsurl = "https://example.com"
response = requests.get(url)
page_text = response.text# 使用 lxml 构建 HTML 树
tree = etree.HTML(page_text)

2.2 定位元素

XPath 提供基于路径的定位方式,支持多种表达式。

2.2.1 标签定位

使用标签名称定位:

# 定位 class 为 'example' 的 div 标签
tag = tree.xpath('//div[@class="example"]')# 定位第一个 p 标签
tag = tree.xpath('//p[1]')
2.2.2 层级关系
  • //:匹配所有子孙节点。
  • /:匹配直接子节点。
# 定位 ul 标签下的所有 li 标签
tags = tree.xpath('//ul/li')# 定位第一个 ul 标签下的第2个 li 元素
tag = tree.xpath('//ul[1]/li[2]')
2.2.3 多条件组合

通过逻辑运算符组合条件:

# 定位 class 为 'item' 且包含子标签 a 的 div
tags = tree.xpath('//div[@class="item" and .//a]')

2.3 提取内容与属性

提取节点中的文本内容或属性值:

  • 提取文本内容

    • /text():获取直系文本。
    • //text():获取所有文本(包括子节点)。
  • 提取属性值

    • /@属性名:获取属性值。
# 提取 h1 标签中的文本
title = tree.xpath('//h1/text()')# 提取 img 标签中的 src 属性
images = tree.xpath('//img/@src')

3. BeautifulSoup 与 XPath 的对比

功能BeautifulSoupXPath
定位方式标签名、类名、CSS 选择器路径表达式
复杂定位支持层级选择,但多条件较繁琐支持复杂路径、条件组合
速度适合中小规模数据提取速度更快,适合大规模数据处理
学习曲线简单直观,适合初学者需掌握路径表达式
灵活性灵活但较依赖 HTML 结构更强大,适合多样化需求

4. 实际应用场景

4.1 BeautifulSoup 的适用场景

  • 页面结构简单,数据提取需求不复杂。
  • 初学者快速实现爬取任务。
  • 配合 Selenium 处理动态页面。

4.2 XPath 的适用场景

  • 数据结构复杂,需求多样化。
  • 需要高效处理大量数据。
  • 更适合嵌套结构的深层次提取。

5. 综合选择建议

  1. BeautifulSoup

    • 优先适用于结构简单的静态页面。
    • 学习成本低,适合快速开发。
  2. XPath

    • 更适合复杂、嵌套结构的网页。
    • 在大规模数据处理中的效率较高。
  3. 结合使用

    • 可以先用 XPath 定位大范围节点,再用 BeautifulSoup 提取具体内容。

6. 示例代码:两者结合使用

以下是使用 BeautifulSoup 和 XPath 的综合示例:

from bs4 import BeautifulSoup
from lxml import etree
import requestsurl = "https://example.com"
response = requests.get(url)
page_text = response.text# 使用 XPath 定位大范围节点
tree = etree.HTML(page_text)
items = tree.xpath('//div[@class="item"]')# 使用 BeautifulSoup 细化提取内容
for item in items:soup_item = BeautifulSoup(etree.tostring(item), 'lxml')title = soup_item.select_one('h2').textlink = soup_item.select_one('a')['href']print(title, link)

以上内容完整介绍了 BeautifulSoupXPath 的用法及对比,希望对你的爬虫开发有帮助!

相关文章:

BeautifulSoup 与 XPath 用法详解与对比

BeautifulSoup(bs4) 和 XPath 是学习python爬虫过程中常常用到的库,本文将详细介绍它们的功能、使用方法、优缺点以及实际应用中的区别和选择建议。 1. BeautifulSoup 用法详解 1.1 什么是 BeautifulSoup? BeautifulSoup 是 Pyt…...

Emacs 折腾日记(五)——elisp 数字类型

本文是参考 emacs lisp 简明教程 写的,很多东西都是照搬里面的内容,如果各位读者觉得本文没有这篇教程优秀或者有抄袭嫌疑、又或者觉得我更新比较慢、再或者其他什么原因,请直接阅读上述链接中的教程。 上一篇我们讲了elisp中的流程控制结构相…...

重拾设计模式--外观模式

文章目录 外观模式(Facade Pattern)概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式(Facade Pattern)概述 定义 外观模式是一种结构型设计模式,它为子系统中的一组接口提供了一个统一…...

源码编译llama.cpp for android

源码编译llama.cpp for android 我这有已经编译好的版本,直接下载使用: https://github.com/turingevo/llama.cpp-build/releases/tag/b4331 准备 android-ndk 已下载: /media/wmx/ws1/software/qtAndroid/Sdk/ndk/23.1.7779620版本 &am…...

StarRocks 排查单副本表

文章目录 StarRocks 排查单副本表方式1 查询元数据,检查分区级的副本数方式2 SHOW PARTITIONS命令查看 ReplicationNum修改副本数命令 StarRocks 排查单副本表 方式1 查询元数据,检查分区级的副本数 # 方式一 查询元数据,检查分区级的副本数…...

Windows11 家庭版安装配置 Docker

1. 安装WSL WSL 是什么: WSL 是一个在 Windows 上运行 Linux 环境的轻量级工具,它可以让用户在 Windows 系统中运行 Linux 工具和应用程序。Docker 为什么需要 WSL: Docker 依赖 Linux 内核功能,WSL 2 提供了一个高性能、轻量级的…...

线程知识总结(二)

本篇文章以线程同步的相关内容为主。线程的同步机制主要用来解决线程安全问题,主要方式有同步代码块、同步方法等。首先来了解何为线程安全问题。 1、线程安全问题 卖票示例,4 个窗口卖 100 张票: class Ticket implements Runnable {priv…...

解决vscode ssh远程连接服务器一直卡在下载 vscode server问题

目录 方法1:使用科学上网 方法2:手动下载 方法3 在使用vscode使用ssh远程连接服务器时,一直卡在下载"vscode 服务器"阶段,但MobaXterm可以正常连接服务器,大概率是网络问题,解决方法如下: 方…...

【Cadence射频仿真学习笔记】IC设计中电感的分析、建模与绘制(EMX电磁仿真,RFIC-GPT生成无源器件及与cadence的交互)

一、理论讲解 1. 电感设计的两个角度 电感的设计可以从两个角度考虑,一个是外部特性,一个是内部特性。外部特性就是把电感视为一个黑盒子,带有两个端子,如果带有抽头的电感就有三个端子,需要去考虑其电感值、Q值和自…...

Definition of Done

Definition of Done English Version The team agrees on, a checklist of criteria which must be met before a product increment “often a user story” is considered “done”. Failure to meet these criteria at the end of a sprint normally implies that the work …...

【漏洞复现】CVE-2023-37461 Arbitrary File Writing

漏洞信息 NVD - cve-2023-37461 Metersphere is an opensource testing framework. Files uploaded to Metersphere may define a belongType value with a relative path like ../../../../ which may cause metersphere to attempt to overwrite an existing file in the d…...

简单工厂模式和策略模式的异同

文章目录 简单工厂模式和策略模式的异同相同点:不同点:目的:结构: C 代码示例简单工厂模式示例(以创建图形对象为例)策略模式示例(以计算价格折扣策略为例)UML区别 简单工厂模式和策…...

HuggingFace datasets - 下载数据

文章目录 下载数据修改默认保存地址 TRANSFORMERS_CACHE保存到本地 & 本地加载保存加载 读取 .arrow 数据 下载数据 1、Python 代码下载 from datasets import load_dataset imdb load_dataset("imdb") # name参数为full或mini,full表示下载全部数…...

梯度(Gradient)和 雅各比矩阵(Jacobian Matrix)的区别和联系:中英双语

雅各比矩阵与梯度:区别与联系 在数学与机器学习中,梯度(Gradient) 和 雅各比矩阵(Jacobian Matrix) 是两个核心概念。虽然它们都描述了函数的变化率,但应用场景和具体形式有所不同。本文将通过…...

Vscode搭建C语言多文件开发环境

一、文章内容简介 本文介绍了 “Vscode搭建C语言多文件开发环境”需要用到的软件,以及vscode必备插件,最后多文件编译时tasks.json文件和launch.json文件的配置。即目录顺序。由于内容较多,建议大家在阅读时使用电脑阅读,按照目录…...

自定义 C++ 编译器的调用与管理

在 C 项目中,常常需要自动化地管理编译流程,例如使用 MinGW 或 Visual Studio 编译器进行代码的编译和链接。为了方便管理不同编译器和简化编译流程,我们开发了一个 CompilerManager 类,用于抽象编译器的查找、命令生成以及执行。…...

时间管理系统|Java|SSM|JSP|

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…...

用SparkSQL和PySpark完成按时间字段顺序将字符串字段中的值组合在一起分组显示

用SparkSQL和PySpark完成以下数据转换。 源数据: userid,page_name,visit_time 1,A,2021-2-1 2,B,2024-1-1 1,C,2020-5-4 2,D,2028-9-1 目的数据: user_id,page_name_path 1,C->A 2,B->D PySpark: from pyspark.sql import SparkSes…...

Sentinel 学习笔记3-责任链与工作流程

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏,原文地址如下: https://blog.csdn.net/baidu_28523317/category_10400605.html 上一篇梳理了概念与核心类:Sentinel 学习笔记2- 概念与核心类介绍-CSDN博客 补一个点:…...

Latex 转换为 Word(使用GrindEQ )(英文转中文,毕业论文)

效果预览 第一步: 告诉chatgpt: 将latex格式中的英文翻译为中文(符号和公式不要动),给出latex格式第二步: Latex 转换为 Word(使用GrindEQ ) 视频 https://www.bilibili.com/video/BV1f242…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

管理学院权限管理系统开发总结

文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...