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 的对比
功能 | BeautifulSoup | XPath |
---|---|---|
定位方式 | 标签名、类名、CSS 选择器 | 路径表达式 |
复杂定位 | 支持层级选择,但多条件较繁琐 | 支持复杂路径、条件组合 |
速度 | 适合中小规模数据提取 | 速度更快,适合大规模数据处理 |
学习曲线 | 简单直观,适合初学者 | 需掌握路径表达式 |
灵活性 | 灵活但较依赖 HTML 结构 | 更强大,适合多样化需求 |
4. 实际应用场景
4.1 BeautifulSoup 的适用场景
- 页面结构简单,数据提取需求不复杂。
- 初学者快速实现爬取任务。
- 配合 Selenium 处理动态页面。
4.2 XPath 的适用场景
- 数据结构复杂,需求多样化。
- 需要高效处理大量数据。
- 更适合嵌套结构的深层次提取。
5. 综合选择建议
-
BeautifulSoup:
- 优先适用于结构简单的静态页面。
- 学习成本低,适合快速开发。
-
XPath:
- 更适合复杂、嵌套结构的网页。
- 在大规模数据处理中的效率较高。
-
结合使用:
- 可以先用 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)
以上内容完整介绍了 BeautifulSoup 和 XPath 的用法及对比,希望对你的爬虫开发有帮助!
相关文章:
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…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...