【 Beautiful Soup (bs4) 详解】

引言

Beautiful Soup 是 Python 最流行的 HTML/XML 解析库,能够从复杂的网页文档中高效提取数据。以下是其核心知识点及示例代码。


一、库简介

1. 核心模块

  • BeautifulSoup:主类,用于构建文档树结构
  • Tag:表示 HTML/XML 标签的对象
  • NavigableString:标签内文本内容的特殊字符串类型
  • Comment:处理 HTML 注释的特殊类型

2. 主要特性

  • 自动修复不规范文档
  • 支持多种解析器(html.parser, lxml, html5lib)
  • 提供 DOM 树遍历和搜索方法

二、安装与基础使用

1. 安装

pip install beautifulsoup4  # 安装 bs4
pip install lxml           # 推荐安装高效解析器

2. 基础示例

from bs4 import BeautifulSoup# 示例 HTML 文档
html_doc = """
<html>
<head><title>测试页面</title></head>
<body>
<div class="content"><h1 id="main-title">网页标题</h1><p class="text">第一段文字</p><p class="text special">特殊段落</p><a href="https://example.com">示例链接</a>
</div>
</body>
</html>
"""# 创建 BeautifulSoup 对象(指定解析器)
soup = BeautifulSoup(html_doc, 'lxml')# 获取标题文本
title = soup.title.string
print("页面标题:", title)  # 输出: 测试页面

三、核心操作示例

1. 标签查找

# 查找第一个 div 标签
div_tag = soup.find('div')
print("Div 类名:", div_tag['class'])  # 输出: ['content']# 查找所有 p 标签
p_tags = soup.find_all('p')
for i, p in enumerate(p_tags, 1):print(f"段落{i}:", p.text)

2. CSS 选择器

# 选择类名为 "text" 的所有元素
text_elements = soup.select('.text')
print("找到的文本元素数量:", len(text_elements))  # 输出: 2# 选择 id 为 main-title 的元素
title = soup.select_one('#main-title')
print("主标题:", title.text)  # 输出: 网页标题

3. 属性操作

# 获取链接的 href 属性
link = soup.find('a')
print("链接地址:", link['href'])  # 输出: https://example.com# 修改标签属性
link['target'] = '_blank'
print("修改后的链接标签:", link)

4. 文档树导航

# 父子节点操作
body_tag = soup.body
print("Body 的直接子节点数量:", len(list(body_tag.children)))  # 输出: 3(含空白文本节点)# 兄弟节点查找
first_p = soup.find('p')
next_p = first_p.find_next_sibling('p')
print("下一个段落的类名:", next_p['class'])  # 输出: ['text', 'special']

5. 文本处理

# 获取所有文本内容(合并结果)
full_text = soup.get_text()
print("完整文本:", full_text.strip())# 处理注释
comment_html = "<p>这是一段<!-- 这是注释 -->测试文本</p>"
comment_soup = BeautifulSoup(comment_html, 'lxml')
comment = comment_soup.p.next_element.next_element
print("注释内容:", comment)  # 输出: 这是注释

四、高级应用示例

1. 提取表格数据

table_html = """
<table><tr><th>姓名</th><th>年龄</th></tr><tr><td>张三</td><td>25</td></tr><tr><td>李四</td><td>30</td></tr>
</table>
"""table_soup = BeautifulSoup(table_html, 'lxml')
rows = table_soup.find_all('tr')# 提取表格数据到字典列表
data = []
for row in rows[1:]:  # 跳过表头cols = row.find_all('td')data.append({'name': cols[0].text,'age': int(cols[1].text)})print("表格数据:", data)

2. 处理嵌套结构

# 多层嵌套选择
nested_html = """
<div class="article"><div class="header"><h2>文章标题</h2><div class="meta">2023-08-01</div></div><div class="content"><p>正文内容...</p></div>
</div>
"""nested_soup = BeautifulSoup(nested_html, 'lxml')
meta = nested_soup.select('.article > .header > .meta')
print("发布日期:", meta[0].text)  # 输出: 2023-08-01

五、注意事项

  1. 解析器选择

    • html.parser:Python 内置,速度一般
    • lxml:速度快,需要额外安装
    • html5lib:容错性最好,速度最慢
  2. 编码处理

    # 显式指定编码
    soup = BeautifulSoup(html_content, 'lxml', from_encoding='utf-8')
    
  3. 动态内容处理

    • 对于 JavaScript 渲染的页面,需要配合 Selenium 或 Requests-HTML 使用

官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/

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

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

相关文章

傅利叶发布首款开源人形机器人N1:开发者可实现完整复刻

2025年4月11日&#xff0c;上海——通用机器人公司傅利叶正式发布首款开源人形机器人 Fourier N1&#xff0c;并同步开放涵盖物料清单、设计图纸、装配指南、基础操作软件在内的完整本体资源包。作为傅利叶 “Nexus 开源生态矩阵” 的首个落地项目&#xff08;“N1” 即 “Nexu…

视觉目标检测大模型GAIA

中国科学院自动化研究所智能感知与计算研究中心携手华为等领军企业&#xff0c;共同推出面向产业应用的视觉目标检测全流程解决方案——GAIA智能检测平台。该研究成果已获CVPR 2021会议收录&#xff08;论文链接&#xff1a; 论文地址&#xff1a;https://arxiv.org/pdf/2106.…

前端时间同步利器:React + useEffect 实现高性能动态时钟

前言 在你奋笔疾敲代码的瞬间&#xff0c;是不是突然一低头&#xff0c;发现时间像偷偷跑路的变量&#xff0c;一眨眼就从上午飘到下午&#xff1f;饭没吃、会没开、工位也快被前端猫霸占了。仿佛你写的不是代码&#xff0c;而是“时间穿梭机”。别慌&#xff0c;咱们今天就来…

前端动画性能优化

前端动画性能优化全攻略&#xff1a;告别卡顿与高CPU占用 一、动画性能问题现状分析 1.1 性能问题现象 动画帧率低于60FPS时出现明显卡顿滚动/缩放操作时响应延迟CPU占用率长期超过70%移动端设备发热严重 1.2 核心问题根源 浏览器渲染流程中的性能瓶颈主要出现在&#xff1…

springboot中如何处理跨域

什么是跨域 跨域&#xff08;Cross-Origin&#xff09;是浏览器出于安全考虑&#xff0c;对不同源的资源访问施加的限制机制。其核心原因是同源策略&#xff08;Same-Origin Policy&#xff09;&#xff0c;即浏览器仅允许协议&#xff08;Protocol&#xff09;、域名&#xf…

js实现生肖宜忌展示

实现效果图如下 实现逻辑&#xff1a; 1.录入属相列表&#xff08;列表顺序不可调整&#xff09;&#xff1b; 2.录入各属相相宜、相忌属相&#xff1b; 3.输入年份后&#xff0c;根据属相列表获取到正确的属相&#xff1b; 4.根据获取的属相去展示宜、忌属相&#xff1b; 5.打…

3DMAX笔记-UV知识点和烘焙步骤

1. 在展UV时&#xff0c;如何点击模型&#xff0c;就能选中所有这个模型的uv 2. 分多张UV时&#xff0c;不同的UV的可以设置为不同的颜色&#xff0c;然后可以通过颜色进行筛选。 3. 烘焙步骤 摆放完UV后&#xff0c;要另存为一份文件&#xff0c;留作备份 将模型部件全部分成…

AI 重构 Java 遗留系统:从静态方法到 Spring Bean 注入的自动化升级

在当今快速发展的软件行业中&#xff0c;许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法&#xff0c;随着业务的不断发展&#xff0c;其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具&#xff0c;为 Java 遗留系统的重构提供了…

【从一个 TypeScript 报错理解 ES6 模块的三种导入方式】

从一个 TypeScript 报错理解 ES6 模块的三种导入方式 在日常开发中&#xff0c;我们经常遇到模块导入导出的场景。最近在处理一个项目时&#xff0c;遇到了一个有趣的问题&#xff1a;对于只有默认导出的模块&#xff0c;我们该使用哪种导入方式&#xff1f;这个问题引发了对 …

安徽京准:NTP网络时钟服务器功能及同步模式的介绍

安徽京准&#xff1a;NTP网络时钟服务器功能及同步模式的介绍 安徽京准&#xff1a;NTP网络时钟服务器功能及同步模式的介绍 1、NTP网络时钟服务器概念&#xff1a; NTP时钟服务器&#xff0c;表面意思是时间计量工具的服务设备&#xff0c;其在现代工业中是用于对客户端设备…

JMeter从入门到荒废-常见问题汇总

启动某个ThreadGroup的时候&#xff0c;启动不了 现象 点击start按钮的时候&#xff0c;结果树和汇总报告都没有任何数据。 同时&#xff0c;点击右上角的error log 发现有错误信息&#xff1a; 错误信息如下&#xff1a; 2025-04-09 10:03:48,009 ERROR o.a.j.g.a.ActionR…

Elasticsearch 学习规划

Elasticsearch 学习规划 明确学习目标与动机 场景化需求分析 - **S**&#xff1a;掌握Elasticsearch架构体系&#xff0c;熟练使用Elasticsearch 进行数据分析,Elasticsearch结合java 项目落地案例 - **M**&#xff1a;搜索和Elasticsearch相关GitHub项目 - **A**&#xff1a;每…

核心案例 | 湖南汽车工程职业大学无人机操控与编队技术实验室

核心案例 | 湖南汽车工程职业大学无人机操控与编队技术实验室 为满足当今无人机行业应用需求&#xff0c;推动无人机技术的教育与实践深度融合&#xff0c;北京卓翼智能科技有限公司旗下品牌飞思实验室与湖南汽车工程职业大学强强联手&#xff0c;共同建设无人机操控与编队技术…

【Android】Android 获取当前前台应用包名与自动化控制全流程实践笔记(适配 Android 10+)

一、前言 在 Android 系统中&#xff0c;获取当前运行的前台应用、返回桌面、跳转权限设置、关闭其他应用等行为&#xff0c;往往受到系统的严格限制。随着 Android 版本的提升&#xff08;特别是 Android 10 之后&#xff0c;即 API 29&#xff09;&#xff0c;很多传统方法已…

Sentinel核心源码分析(上)

文章目录 前言一、客户端与Spring Boot整合二、SphU.entry2.1、构建责任链2.2、调用责任链2.2.1、NodeSelectorSlot2.2.2、ClusterBuilderSlot2.2.3、LogSlot2.2.4、StatisticSlot2.2.5、AuthoritySlot2.2.6、SystemSlot2.2.7、FlowSlot2.2.7.1、selectNodeByRequesterAndStrat…

浅谈「分词」:原理 + 方案对比 + 最佳实践

在文本搜索、自然语言处理、智能推荐等场景中&#xff0c;「分词」 是一个基础但至关重要的技术点。无论是用数据库做模糊查询&#xff0c;还是构建搜索引擎&#xff0c;分词都是提高效率和准确度的核心手段。 &#x1f50d; 一、什么是分词&#xff1f; 分词&#xff08;Tok…

transformers:打造的先进的自然语言处理

github地址&#xff1a;https://github.com/huggingface/transformers Transformers 提供了数以千计的预训练模型&#xff0c;支持 100 多种语言的文本分类、信息抽取、问答、摘要、翻译、文本生成。它的宗旨是让NLP 技术人易用。 Transformers 提供了便于快速下载和使用的API…

Spring Boot 集成 MongoDB 时自动创建的核心 Bean 的详细说明及表格总结

以下是 Spring Boot 集成 MongoDB 时自动创建的核心 Bean 的详细说明及表格总结&#xff1a; 核心 Bean 列表及详细说明 1. MongoClient 类型&#xff1a;com.mongodb.client.MongoClient作用&#xff1a; MongoDB 客户端核心接口&#xff0c;负责与 MongoDB 服务器建立连接、…

113. 在 Vue 3 中使用 OpenLayers 实现鼠标移动显示坐标信息

✨ 写在前面 在地图类项目开发中&#xff0c;一个常见需求就是&#xff1a;实时获取用户鼠标在地图上的经纬度坐标&#xff0c;并展示在地图上。 本文将通过一个简单的案例&#xff0c;手把手带大家在 Vue 3 项目中集成 OpenLayers 地图库&#xff0c;并实现以下功能&#xf…

docker配置redis容器时搭载哨兵节点的情况下配置文件docker-compose.yml示例

1.配置数据节点&#xff08;主从节点&#xff09; version: 3.7 services:master:image: redis:5.0.9container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports:- 6379:6379slave1:image: redis:5.0.9container_name: redis-slave1restart: a…