【 Beautiful Soup (bs4) 详解】

news2025/4/19 3:26:30

引言

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.coloradmin.cn/o/2332863.html

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

相关文章

RT-DETR-R18版本的ultralytics的yaml更改分享!!

0.前言 起因&#xff1a; 本人深度学习&#xff0c;无奈组内没有好的显卡&#xff0c;只有我自己拥有的一张4060卡跑CV&#xff0c;稍微大一点的模型跑不了&#xff0c;我的模型主打一个轻量化... 在找模型与我的模型进行比较的时候&#xff0c;看的RT-DETR-R18版本(GFLPOS也…

AI低代码平台:开启高效智能开发新时代

科技飞速发展的当下&#xff0c;全球正加速迈向 AI 化。DeepSeek 等主流 AI 厂商的发展极大地改变了技术格局。众多企业为紧跟时代步伐&#xff0c;对高效开发工具的需求愈发迫切。百特搭AI低代码开发平台与 AI 技术的融合&#xff0c;为企业带来了开发高效化与智能化的全新解决…

苍穹外卖2

根据id查询员工 调用顺序&#xff1a;Controller—>Service—>ServiceImpl—>Mapper—>xml 1.controller层一个tab秒了&#xff08;ai生成&#xff09; 由于result泛型中希望返回一个employee对象&#xff0c;所以定义一个employee来接受Service的getbyid方法,在…

mac|使用scrcpy实现无线Android投屏

scrcpy是一个开源项目&#xff0c;从项目的releases可以得知它适用于windows、linux、mac github&#xff1a;https://github.com/Genymobile/scrcpy/releases github中提供了应用于mac系统的静态版本&#xff08;也就是上图的scrcpy-macos-aarch64-v3.1.tar.gz和scrcpy-macos…

【智驾中的大模型 -1】自动驾驶场景中的大模型

1. 前言 我们知道&#xff0c;大模型现在很火爆&#xff0c;尤其是 deepseek 风靡全球后&#xff0c;大模型毫无疑问成为为中国新质生产力的代表。百度创始人李彦宏也说&#xff1a;“2025 年可能会成为 AI 智能体爆发的元年”。 随着科技的飞速发展&#xff0c;大模型的影响…

网络4 OSI7层

OSI七层模型&#xff1a;数据如何传送&#xff0c;向下传送变成了什么样子 应用层 和用户打交道&#xff0c;向用户提供服务。 例如&#xff1a;web服务、http协议、FTP协议 1.用户接口 2.提供各种服务 通过浏览器&#xff08;接口&#xff09;提供Web服务 表示层 翻译 我的“…

文件IO6(开机动画的显示原理/触摸屏的原理与应用)

开机动画的显示原理 ⦁ 基本原理 一般电子产品在开机之后都会加深用户印象&#xff0c;一般开机之后都会播放一段开机动画&#xff08;视频、GIF…&#xff09;&#xff0c;不管哪种采用形式&#xff0c;内部原理都是相同&#xff0c;都是利用人类的眼睛的视觉暂留效应实现的…

低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡

低代码开发能否取代后端&#xff1f;深度剖析与展望-优雅草卓伊凡 在科技迅猛发展的当下&#xff0c;软件开发领域新思潮与新技术不断涌现&#xff0c;引发行业内外热烈探讨。近日&#xff0c;笔者收到这样一个颇具争议的问题&#xff1a;“低代码开发能取代后端吗&#xff1f…

反向代理断线重连优化

背景 1. 部分时候&#xff0c;反向代理因为路由重启&#xff0c;或者其他断网原因&#xff0c;等网络恢复后&#xff0c;无法对隧道重连。 2. 增加了心跳机制 在DEBUG调试过程中&#xff0c;发现禁用网卡后&#xff0c;在反向代理重连时候&#xff0c;服务器没有释放掉占用的…

array和list在sql中的foreach写法

在MyBatis中&#xff0c;<foreach>标签用于处理集合或数组类型的参数&#xff0c;以便在SQL语句中动态生成IN子句或其他需要遍历集合的场景。以下是array和list在SQL中的<foreach>写法总结。 <if test"taskIds ! null and taskIds.length > 0">…

SDP(一)

SDP(Session Description Protocol)会话描述协议相关参数 Session Description Protocol Version (v): 0 --说明&#xff1a;SDP当前版本号 Owner/Creator, Session Id (o): - 20045 20045 IN IP4 192.168.0.0 --说明&#xff1a;发起者/创建者 会话ID&#xff0c;那么该I…

STM32 模块化开发指南 · 第 2 篇 如何编写高复用的外设驱动模块(以 UART 为例)

本文是《STM32 模块化开发实战指南》的第 2 篇,聚焦于“串口驱动模块的设计与封装”。我们将从一个最基础的裸机 UART 初始化开始,逐步实现:中断支持、环形缓冲收发、模块接口抽象与测试策略,构建一个可移植、可扩展、可复用的 UART 驱动模块。 一、模块化 UART 的设计目标…

小推桌面tv-小推电视桌面好用吗

想知道小推电视桌面是否好用&#xff1f;来一探究竟&#xff01;小推电视桌面安全稳定&#xff0c;且支持自由定制。它有影视、壁纸、酒店等多种主题&#xff0c;适配不同场景。内置小推语音助手&#xff0c;还支持第三方语音助手&#xff0c;操作便捷。自带正版影视搜索功能&a…

深入解析嵌入式Linux系统架构:从Bootloader到用户空间 - 结合B站视频教学

B站视频链接,请多多关注本人B站&#xff1a; &#x1f4cc; Yocto项目实战教程&#xff1a;第二章 视频讲解 目录 第2章 Linux系统架构 2.1 GNU/Linux2.2 Bootloader2.3 内核空间2.4 用户空间 总结 第2章 Linux系统架构 {#linux系统架构} 嵌入式Linux系统是Linux内核的精简版…

Vue.js组件安全开发实战:从架构设计到攻防对抗

目录 开篇总述&#xff1a;安全视角下的Vue组件开发新范式 一、Vue.js组件开发现状全景扫描 二、安全驱动的Vue组件创新架构 三、工程化组件体系构建指南 四、深度攻防对抗实战解析 五、安全性能平衡策略 结语&#xff1a;安全基因注入前端开发的未来展望 下期预告&…

质因数之和-蓝桥20249

题目&#xff1a; 代码&#xff1a;无脑直接根据题目&#xff0c;一步步操作就行 #include <iostream> using namespace std;int gcd(int a,int b){if(b0) return a;return gcd(b,a%b); }bool exist_gcd(int a,int b){if(gcd(a,b)1) return false;return true; }bool is…

《栈区、堆区和静态区:内存管理的三大支柱》

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 一、栈区&#xff08;Stack&#xff09;&#xff08;一&#xff09;栈区的定义&#xff08;二&#xff09;栈区的特点&#xff08;三&#xff09;栈区的使用…

今日行情明日机会——20250411

今天缩量&#xff0c;上方压力依然在&#xff0c;外围还在升级&#xff0c;企稳还需要时日。 2025年4月11日A股涨停主要行业方向分析 一、核心主线方向 芯片&#xff08;半导体&#xff09; • 涨停家数&#xff1a;24家&#xff08;当日最强方向&#xff09;。 • 驱动逻辑&…

【Linux】TCP_Wrappers+iptables实现堡垒机功能

规划 显示jumpserver的简单功能&#xff0c;大致的网络拓扑图如下 功能规划 & 拓扑结构 JumpServer&#xff08;堡垒机&#xff09;主要功能&#xff1a; 对访问目标服务器进行统一入口控制&#xff08;例如 nginx、mysql、redis&#xff09;。使用 iptables 做 NAT 转…

ssh 登录报错集合(FQA)

1、使用root登录失败&#xff08;远程主机不允许root登录&#xff09; 问题&#xff1a;通过 ssh 连接远程主机&#xff08; ubuntu &#xff09;时报错&#xff0c;Permission denied 如下&#xff1a; 解决方法&#xff1a;确认root的登录密码没错&#xff0c;且可以正常与远…