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

Python爬虫之使用BeautifulSoup进行HTML Document文档的解析

BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库,它为开发者提供了一种简单的方式来查找、遍历和修改文档树。BeautifulSoup 特别擅长处理不规则或格式不佳的标记语言,可以自动更正无效的 HTML,因此在网页抓取(Web Scraping)中非常受欢迎。

【1】基本介绍

主要特点

  • 易于使用:提供了直观的方法来导航、搜索和修改解析树。
  • 容错性强:能够处理有缺陷的 HTML,并尝试生成最可能的解析结果。
  • 多种解析器:支持 Python 标准库中的 HTML 解析器,以及第三方解析器如 lxml 和 html5lib。
  • 链式调用:可以通过连续调用方法来构建查询,使得代码更加简洁和易读。

安装

你可以通过 pip 安装 BeautifulSoup:

pip install beautifulsoup4

如果需要安装额外的解析器,比如 lxml 或 html5lib,也可以通过 pip 安装:

pip install lxml
pip install html5lib

【2】 基本用法

下面是一个简单的例子,展示如何使用 BeautifulSoup 来解析 HTML 内容并提取信息:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div><ul><li id="l1">张三</li><li id="l2">李四</li><li>王五</li><a href="" id="" class="a1">尚硅谷</a><span>嘿嘿嘿</span></ul></div><a href="" title="a2">百度</a><div id="d1"><span>哈哈哈</span></div><p id="p1" class="p1">呵呵呵</p>
</body>
</html>

lxml内核解析本地文件:

# 默认打开的文件的编码格式是gbk 所以在打开文件的时候需要指定编码
soup = BeautifulSoup(open('1.html',encoding='utf-8'),'lxml')

lxml内核解析网络文件:

url = 'https://www.starbucks.com.cn/menu/'
response = urllib.request.urlopen(url)
content = response.read().decode('utf-8')
soup = BeautifulSoup(content,'lxml')

BeautifulSoup 提供了多种方法来寻找文档中的元素:

  • find_all(name, attrs, recursive, string, limit, **kwargs):查找所有符合条件的标签。
  • find(name, attrs, recursive, string, **kwargs):查找第一个符合条件的标签。
  • select(selector):使用 CSS 选择器来查找元素。
  • find_parent(name, attrs, **kwargs)find_parents(name, attrs, **kwargs):向上查找父级标签。
  • find_next_sibling(name, attrs, **kwargs)find_next_siblings(name, attrs, **kwargs):查找后面的兄弟标签。
  • find_previous_sibling(name, attrs, **kwargs)find_previous_siblings(name, attrs, **kwargs):查找前面的兄弟标签。
from bs4 import BeautifulSoup
# 默认打开的文件的编码格式是gbk 所以在打开文件的时候需要指定编码
soup = BeautifulSoup(open('1.html',encoding='utf-8'),'lxml')
# 根据标签名查找节点
# 找到的是第一个符合条件的数据
# print(soup.a)
# 获取标签的属性和属性值
# print(soup.a.attrs)

① find

# 返回的是第一个符合条件的数据
# print(soup.find('a'))# 根据title的值来找到对应的标签对象
# print(soup.find('a',title="a2"))# 根据class的值来找到对应的标签对象  注意的是class需要添加下划线
# print(soup.find('a',class_="a1"))

② find_all

返回的是一个列表 并且返回了所有的a标签

# print(soup.find_all('a'))# 如果想获取的是多个标签的数据 那么需要在find_all的参数中添加的是列表的数据
# print(soup.find_all(['a','span']))# limit的作用是查找前几个数据
# print(soup.find_all('li',limit=2))

③ select(推荐)

# select方法返回的是一个列表  并且会返回多个数据
# print(soup.select('a'))# 可以通过.代表class  我们把这种操作叫做类选择器
# print(soup.select('.a1'))# print(soup.select('#l1'))

属性选择器—通过属性来寻找对应的标签

# 查找到li标签中有id的标签
# print(soup.select('li[id]'))# 查找到li标签中id为l2的标签
# print(soup.select('li[id="l2"]'))

层级选择器/后代选择器

# 找到的是div下面的li
# print(soup.select('div li'))# 子代选择器
#  某标签的第一级子标签
# 注意:很多的计算机编程语言中 如果不加空格不会输出内容  但是在bs4中 不会报错 会显示内容
# print(soup.select('div > ul > li'))# 找到a标签和li标签的所有的对象
# print(soup.select('a,li'))

获取节点内容

# obj = soup.select('#d1')[0]
# print(obj.string)
# print(obj.get_text())

如果标签对象中 只有内容 那么string和get_text()都可以使用,如果标签对象中 除了内容还有标签 那么string就获取不到数据 ,而get_text()是可以获取数据

我们一般情况下 推荐使用get_text()。

节点的属性

# obj = soup.select('#p1')[0]
# name是标签的名字
# print(obj.name)
# 将属性值左右一个字典返回
# print(obj.attrs)# 获取节点的属性
obj = soup.select('#p1')[0]print(obj.attrs.get('class'))
print(obj.get('class'))
print(obj['class'])

相关文章:

Python爬虫之使用BeautifulSoup进行HTML Document文档的解析

BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库&#xff0c;它为开发者提供了一种简单的方式来查找、遍历和修改文档树。BeautifulSoup 特别擅长处理不规则或格式不佳的标记语言&#xff0c;可以自动更正无效的 HTML&#xff0c;因此在网页抓取&#xff08;Web Sc…...

vue.config.js配置参数说明新手教程

这篇文章主要是对vue.config.js配置文件的主要参数进行一下说明&#xff0c;方便使用时的查询&#xff0c; 下面进行介绍 1、vue.config.js vue.config.js 是一个可选的配置文件&#xff0c;如果项目的 (和 package.json 同级的) 根目录中存在这个文件&#xff0c;那么它会被…...

C# 关于加密技术以及应用(二)

AES&#xff08;Advanced Encryption Standard&#xff09;和 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是两种不同的加密算法&#xff0c;它们各自有特定的使用场景和优势。下面是它们的主要区别和适用场景&#xff1a; AES&#xff08;高级加密标准&#xff09; 特…...

视频中的某些片段如何制作GIF表情包?

动态表情包&#xff08;GIF&#xff09;已经成为我们日常沟通中不可或缺的一部分。GIF&#xff08;Graphics Interchange Format&#xff09;&#xff0c;即图形交换格式&#xff0c;是一种支持多帧图像和透明度的位图文件格式。它最初由 CompuServe 公司在 1987 年推出&#x…...

图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序,GUI界面。附详细的运行说明。

图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序&#xff0c;GUI界面。附详细的运行说明。 目录 图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序&#xff0c;GUI界面。附详细的运行说明。预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基…...

String【Redis对象篇】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a;https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜&#xff0c;同时略懂Vue与React前端技术&#xff0c;也了解一点微信小程序开发。 &#x1f37b; 对计算机充满兴趣&#xff0c;愿意并且希望学习更多的技…...

top命令和系统负载

1 top中的字段说明 top是一个实时系统监视工具&#xff0c;可以动态展现出 CPU 使用率、内存使用情况、进程状态等信息&#xff0c;注意这些显示的文本不能直接使用 > 追加到文件中。 [rootvv~]# top -bn 1 | head top - 20:08:28 up 138 days, 10:29, 4 users, load av…...

ES6 混合 ES5学习记录

基础 数组 let arr [数据1&#xff0c;数据2&#xff0c;...数组n] 使用数组 数组名[索引] 数组长度 arr.length 操作数组 arr.push() 尾部添加一个,返回新长度 arr.unshift() 头部添加一个,返回新长度 arr.pop() 删除最后一个,并返回该元素的值 shift 删除第一个单元…...

HTTP 状态码大全

常见状态码 200 OK # 客户端请求成功 400 Bad Request # 客户端请求有语法错误 不能被服务器所理解 401 Unauthorized # 请求未经授权 这个状态代码必须和WWW- Authenticate 报头域一起使用 403 Forbidden # 服务器收到请求但是拒绝提供服务 404 Not Found # 请求资源不存…...

Redis学习(13)| Redisson 看门狗机制深度解析

文章目录 摘要1. 引言2. 看门狗的工作原理2.1 自动续期2.2 防止意外释放2.3 合理配置 3. 应用场景4. 最佳实践4.1 设置合理的lockWatchdogTimeout4.2 避免死锁4.3 监控和日志 5. 实现方式6. 使用示例7. 结论 摘要 Redisson 是一个用于 Redis 的 Java 客户端&#xff0c;它提供…...

【开源大屏】玩转开源积木BI,从0到1设计一个大屏

积木 BI 重磅推出免费大屏设计器&#xff01;功能超强大&#xff0c;操作超流畅&#xff0c;体验超酷炫。快来体验一下吧。 让我们一起来看一下如何从0到1设计一个大屏。 一、积木BI大屏介绍 积木BI可视化数据大屏 是一站式数据可视化展示平台&#xff0c;旨在帮助用户快速通…...

基于PCRLB的CMIMO雷达资源调度方法(MATLAB实现)

集中式多输入多输出CMIMO雷达作为一种新体制雷达&#xff0c;能够实现对多个目标的同时多波束探测&#xff0c;在多目标跟踪领域得到了广泛运用。自从2006年学者Haykin提出认知雷达理论&#xff0c;雷达资源分配问题就成为一个有实际应用价值的热点研究内容。本文基于目标跟踪的…...

PAT--1035 插入与归并

题目描述 根据维基百科的定义&#xff1a; 插入排序是迭代算法&#xff0c;逐一获得输入数据&#xff0c;逐步产生有序的输出序列。每步迭代中&#xff0c;算法从输入序列中取出一元素&#xff0c;将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如…...

Ubuntu20.04.6编译OpenWRT23.05.5错误

在Ubuntu20.04.6编译OpenWRT23.05.5时&#xff0c;会出现如下提示&#xff1a; fatal error: asm/types.h: No such file or directory 如果我们执行如下命令&#xff1a; sudo ln -s /usr/include/asm-generic /usr/include/asm 此时再次编译&#xff0c;会有如下提示&…...

一文说清flink从编码到部署上线

引言:目前flink的文章比较多,但一般都关注某一特定方面,很少有一个文章,从一个简单的例子入手,说清楚从编码、构建、部署全流程是怎么样的。所以编写本文,自己做个记录备查同时跟大家分享一下。本文以简单的mysql cdc为例展开说明。 环境说明:MySQL:5.7;flink:1.14.0…...

【5G】5G Physical Layer物理层(一)

5G多址接入和物理层与长期演进&#xff08;LTE&#xff09;存在一些差异。在下行方向&#xff0c;5G与LTE相似&#xff0c;依旧采用正交频分多址&#xff08;OFDMA&#xff09;。而在上行方向&#xff0c;5G采用了OFDMA和单载波频分多址&#xff08;SC-FDMA&#xff09;&#x…...

GauHuman阅读笔记【3D Human Modelling】

笔记目录 1. 基本信息2. 理解(个人初步理解,随时更改)3. 精读SummaryResearch Objective(s)Background / Problem StatementMethod(s)EvaluationConclusionReferences1. 基本信息 题目:GauHuman: Articulated Gaussian Splatting from Monocular Human Videos时间:2023.12…...

qemu安装arm64架构银河麒麟

qemu虚拟化软件&#xff0c;可以在一个平台上模拟另一个硬件平台&#xff0c;可以支持多种处理器架构。 一、安装 安装教程&#xff1a;https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接&#xff1a;https://qemu.weilnetz.de/w64/2024/ 我下载的是 …...

在Elasticsearch (ES) 中,integer 和 integer_range的区别

在Elasticsearch (ES) 中,integer 和 integer_range 是两种不同的字段类型,它们用于存储和查询不同类型的数据。 Integer: integer 类型是用于存储32位整数值的简单数据类型。这个类型的字段适合用来表示单一的整数数值,例如用户的年龄、商品的数量等。支持标准的数值操作,…...

Playwright中Page类的方法

导航和页面操作 goto(url: str, **kwargs: Any): 导航到一个URL。 reload(**kwargs: Any): 重新加载当前页面。 go_back(**kwargs: Any): 导航到会话历史记录中的前一个页面。 go_forward(**kwargs: Any): 导航到会话历史记录中的下一个页面。 set_default_navigation_tim…...

小龙虾使用手册(蓝皮书)实战案例版

扫描下载文档详情页: https://www.didaidea.com/wenku/16656.html...

SenseVoiceSmall实战案例:如何用AI分析会议录音中的情绪变化

SenseVoiceSmall实战案例&#xff1a;如何用AI分析会议录音中的情绪变化 1. 会议录音分析的痛点与解决方案 在日常工作中&#xff0c;会议录音分析一直是个耗时费力的任务。传统方法需要人工反复听取录音&#xff0c;不仅效率低下&#xff0c;还容易遗漏关键信息。特别是会议…...

YOLOv12涨点改进| TGRS 2025 | 全网独家创新、涨点上采样改进篇| 引入LSE-FPN拉普拉斯增强特征金字塔,有效提升各层特征的表达,含A2C2f_LSE二次创新,小目标检测高效涨点

一、本文介绍 🔥本文给大家介绍利用 LSE-FPN拉普拉斯增强特征金字塔 改进YOLOv12网络模型, 通过在特征金字塔中加入局部语义增强机制并改进多尺度特征融合方式,有效提升了各层特征的表达能力。该模块能够强化低层特征的语义信息,使模型在小目标检测和复杂场景下表现更优,…...

从LED驱动到充电桩:拆解PFC双环控制在5个真实产品里的不同玩法

从LED驱动到充电桩&#xff1a;拆解PFC双环控制在5个真实产品里的不同玩法 当你在深夜加班时&#xff0c;LED驱动电源的稳定输出让办公室保持明亮&#xff1b;当你为电动车充电时&#xff0c;充电桩高效转换着电网能量&#xff1b;这些场景背后都离不开一个关键技术——PFC双环…...

电源键按下去后发生了什么?用Wireshark+日志分析揭秘操作系统启动的隐藏细节

电源键背后的技术探秘&#xff1a;用Wireshark与日志分析揭开系统启动的黑盒 当你按下电源键的那一刻&#xff0c;整台计算机仿佛被注入了生命。但在这个看似简单的动作背后&#xff0c;隐藏着一场精密编排的技术交响乐。作为运维工程师或开发者&#xff0c;理解这个过程不仅有…...

如何通过Bilibili-Evolved打造个性化B站体验?解锁高效视频浏览新方式

如何通过Bilibili-Evolved打造个性化B站体验&#xff1f;解锁高效视频浏览新方式 【免费下载链接】Bilibili-Evolved 强大的哔哩哔哩增强脚本 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved 你是否曾经在B站浏览时遇到这样的困扰&#xff1a;界面广告太…...

LyricsX深度解析:macOS平台终极歌词解决方案的技术实现与高级应用

LyricsX深度解析&#xff1a;macOS平台终极歌词解决方案的技术实现与高级应用 【免费下载链接】LyricsX &#x1f3b6; Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX是一款专为macOS设计的终极歌词应用&#xff0c;通过…...

智能客服原型开发:OpenClaw+Qwen3-32B搭建对话系统

智能客服原型开发&#xff1a;OpenClawQwen3-32B搭建对话系统 1. 为什么选择这个技术栈&#xff1f; 去年我接手了一个智能客服系统的预研项目&#xff0c;客户要求两周内交付可演示的原型。传统方案需要前后端开发、对话引擎集成、工单系统对接&#xff0c;时间根本不够。最…...

影刀RPA神用法:自动监控竞品价格的实操步骤

监控竞品价格的实操步骤数据采集模块配置 打开影刀RPA&#xff0c;创建一个新流程。使用网页抓取功能&#xff0c;定位竞品网站的价格元素。通过XPath或CSS选择器精准获取价格数据&#xff0c;确保动态加载内容也能被捕获。价格异常触发机制 设置价格波动阈值&#xff0c;当竞品…...

数据可视化避坑指南:当产品经理要你做Echarts版丝带图时,这3个技术难点要注意

Echarts丝带图实战&#xff1a;破解企业级数据可视化的三个高阶难题 当医药企业的销售总监盯着大屏上跳动的数字&#xff0c;突然提出"能不能做成Power BI那种丝带图效果"时&#xff0c;开发团队的沉默往往不是因为技术难度&#xff0c;而是对未知领域的本能警惕。这…...