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

爬虫解析库:Beautiful Soup的详细使用

文章目录

    • 1. 安装 Beautiful Soup
    • 2. 基本用法
    • 3. 选择元素
    • 4. 提取数据
    • 5. 遍历元素
    • 6. 修改元素
    • 7. 搜索元素
    • 8. 结合 requests 使用
    • 9. 示例:抓取并解析网页
    • 10. 注意事项

Beautiful Soup 是一个用于解析 HTML 和 XML 文档的 Python 库,它提供了简单易用的 API,能够快速提取和操作网页中的数据。以下是 Beautiful Soup 的详细使用方法:

1. 安装 Beautiful Soup

首先,确保你已经安装了 Beautiful Soup 和解析器(如 lxml 或 html.parser)。你可以通过以下命令安装:pip install beautifulsoup4 lxml

2. 基本用法

初始化:你可以从字符串、文件或 URL 初始化 Beautiful Soup 对象:

from bs4 import BeautifulSoup# 从字符串初始化
html = """
<html><head><title>示例页面</title></head><body><div id="container"><p class="item">Item 1</p><p class="item">Item 2</p><p class="item">Item 3</p></div></body>
</html>
"""
soup = BeautifulSoup(html, 'lxml')  # 使用 lxml 解析器# 从文件初始化
with open('example.html', 'r', encoding='utf-8') as f:soup = BeautifulSoup(f, 'lxml')# 从 URL 初始化(结合 requests)
import requests
response = requests.get('https://example.com')
soup = BeautifulSoup(response.text, 'lxml')

3. 选择元素

Beautiful Soup 提供了多种选择元素的方法。

通过标签名选择

# 选择所有 <p> 标签
p_tags = soup.find_all('p')
for p in p_tags:print(p.text)

通过类名选择

# 选择所有 class 为 "item" 的元素
items = soup.find_all(class_='item')
for item in items:print(item.text)

通过 ID 选择

# 选择 id 为 "container" 的元素
container = soup.find(id='container')
print(container)

通过属性选择

# 选择所有具有 href 属性的 <a> 标签
links = soup.find_all('a', href=True)
for link in links:print(link['href'])

4. 提取数据

获取文本内容

# 获取第一个 <p> 标签的文本内容
text = soup.find('p').text
print(text)

获取属性值

# 获取第一个 <a> 标签的 href 属性
href = soup.find('a')['href']
print(href)

获取 HTML 内容

# 获取第一个 <div> 标签的 HTML 内容
html = soup.find('div').prettify()
print(html)

5. 遍历元素

遍历子元素

# 遍历 id 为 "container" 的所有子元素
container = soup.find(id='container')
for child in container.children:print(child)

遍历所有后代元素

# 遍历 id 为 "container" 的所有后代元素
for descendant in container.descendants:print(descendant)

遍历兄弟元素

# 遍历第一个 <p> 标签的所有兄弟元素
first_p = soup.find('p')
for sibling in first_p.next_siblings:print(sibling)

6. 修改元素

修改文本内容

# 修改第一个 <p> 标签的文本内容
first_p = soup.find('p')
first_p.string = 'New Item'
print(soup)

修改属性值

# 修改第一个 <a> 标签的 href 属性
first_a = soup.find('a')
first_a['href'] = 'https://newexample.com'
print(soup)

添加新元素

# 在 id 为 "container" 的末尾添加一个新 <p> 标签
new_p = soup.new_tag('p', class_='item')
new_p.string = 'Item 4'
container.append(new_p)
print(soup)

7. 搜索元素

使用正则表达式

import re# 查找所有文本中包含 "Item" 的 <p> 标签
items = soup.find_all('p', text=re.compile('Item'))
for item in items:print(item.text)

使用自定义函数

# 查找所有 class 包含 "item" 的 <p> 标签
def has_item_class(tag):return tag.has_attr('class') and 'item' in tag['class']items = soup.find_all(has_item_class)
for item in items:print(item.text)

8. 结合 requests 使用

Beautiful Soup 通常与 requests 库结合使用,用于抓取网页并解析:

import requests
from bs4 import BeautifulSoup# 抓取网页内容
url = 'https://example.com'
response = requests.get(url)
html = response.text# 解析网页
soup = BeautifulSoup(html, 'lxml')# 提取标题
title = soup.find('title').text
print("网页标题:", title)# 提取所有链接
links = soup.find_all('a', href=True)
for link in links:href = link['href']text = link.textprint(f"链接文本: {text}, 链接地址: {href}")

9. 示例:抓取并解析网页

以下是一个完整的示例,展示如何使用 Beautiful Soup 抓取并解析网页数据:

import requests
from bs4 import BeautifulSoup# 抓取网页内容
url = 'https://example.com'
response = requests.get(url)
html = response.text# 解析网页
soup = BeautifulSoup(html, 'lxml')# 提取标题
title = soup.find('title').text
print("网页标题:", title)# 提取所有段落
paragraphs = soup.find_all('p')
for p in paragraphs:print("段落内容:", p.text)# 提取所有链接
links = soup.find_all('a', href=True)
for link in links:href = link['href']text = link.textprint(f"链接文本: {text}, 链接地址: {href}")

10. 注意事项

编码问题:如果网页编码不是 UTF-8,可能需要手动指定编码。

动态内容:Beautiful Soup 只能解析静态 HTML,无法处理 JavaScript 动态加载的内容。如果需要处理动态内容,可以结合 Selenium 或 Pyppeteer 使用。

通过以上方法,你可以使用 Beautiful Soup 轻松解析和提取网页中的数据。它的语法简洁且功能强大,非常适合快速开发爬虫和数据采集工具。

相关文章:

爬虫解析库:Beautiful Soup的详细使用

文章目录 1. 安装 Beautiful Soup2. 基本用法3. 选择元素4. 提取数据5. 遍历元素6. 修改元素7. 搜索元素8. 结合 requests 使用9. 示例&#xff1a;抓取并解析网页10. 注意事项 Beautiful Soup 是一个用于解析 HTML 和 XML 文档的 Python 库&#xff0c;它提供了简单易用的 API…...

OpenHarmony-4.基于dayu800 GPIO 实践(2)

基于dayu800 GPIO 进行开发 1.DAYU800开发板硬件接口 LicheePi 4A 板载 2x10pin 插针&#xff0c;其中有 16 个原生 IO&#xff0c;包括 6 个普通 IO&#xff0c;3 对串口&#xff0c;一个 SPI。TH1520 SOC 具有4个GPIO bank&#xff0c;每个bank最大有32个IO&#xff1a;  …...

【C++设计模式】观察者模式(1/2):从基础到优化实现

1. 引言 在 C 软件与设计系列课程中&#xff0c;观察者模式是一个重要的设计模式。本系列课程旨在深入探讨该模式的实现与优化。在之前的课程里&#xff0c;我们已对观察者模式有了初步认识&#xff0c;本次将在前两次课程的基础上&#xff0c;进一步深入研究&#xff0c;着重…...

《机器学习数学基础》补充资料:欧几里得空间的推广

在《机器学习数学基础》第 1 章介绍了向量空间&#xff0c;并且说明了机器学习问题通常是在欧几里得空间。然而&#xff0c;随着机器学习技术的发展&#xff0c;特别是 AI 技术开始应用于科学研究中&#xff0c;必然会涉及到其他类型的空间。本文即在《机器学习数学基础》一书所…...

在配置PX4中出现的问题2

想要原教程的请看&#xff1a;第一次配置中出现的问题 前面一切正常&#xff08;gazebo导入models那一步在刚刚解压好的文件夹里就删不掉stereo_camera等文件&#xff0c;ls打开也看不到&#xff0c;应该时我下的包里面本来就没有&#xff09;&#xff0c;到 make px4_sitl_def…...

2025-2-24-4.9 单调栈与单调队列(基础题)

文章目录 4.9 单调栈与单调队列&#xff08;基础题&#xff09;单调栈739. 每日温度42. 接雨水单调队列239. 滑动窗口最大值 4.9 单调栈与单调队列&#xff08;基础题&#xff09; 很有趣的两个数据结构。 原视频讲解链接 单调栈 739. 每日温度 题目链接 给定一个整数数组 te…...

python绘图之swarmplot分布散点图

swarmplot 是 Seaborn 提供的一种用于展示分类数据分布的散点图。它的主要作用是将数据点按照分类变量&#xff08;通常是离散变量&#xff09;进行分组&#xff0c;并在每个分类中以一种非重叠的方式展示数据点的位置。这种可视化方式可以帮助我们直观地理解数据在不同分类下的…...

数据库之MySQL——事务(一)

1、MySQL之事务的四大特性(ACID)&#xff1f; 原子性(atomicity)&#xff1a;一个事务必须视为一个不可分割的最小工作单元&#xff0c;整个事务中的所有操作要么全部提交成功&#xff0c;要么全部失败回滚&#xff0c;对于一个事务来说&#xff0c;不可能只执行其中的一部分操…...

Linux学习笔记之文件

1.文件 1.1文件属性 当我们创建文件时&#xff0c;文件就有了对应的属性&#xff0c;可以用mkdir创建目录&#xff0c;touch创建普通文件。用ls -al查看文件属性。 从上图可以看出目录或者文件的所有者&#xff0c;所属组&#xff0c;其他人权限&#xff0c;创建时间等信息。由…...

LLM学习

1、基础概念篇 大模型训练三部曲Pretraining SFT RLHF...

Classic Control Theory | 13 Complex Poles or Zeros (第13课笔记-中文版)

笔记链接&#xff1a;https://m.tb.cn/h.TtdexbP?tkeFAlejKBSzQhttps://m.tb.cn/h.TtdexbP?tkeFAlejKBSzQ...

给小米/红米手机root(工具基本为官方工具)——KernelSU篇

目录 前言准备工作下载刷机包xiaomirom下载刷机包【适用于MIUI和hyperOS】“hyper更新”微信小程序【只适用于hyperOS】 下载KernelSU刷机所需程序和驱动文件 开始刷机设置手机第一种刷机方式【KMI】推荐提取boot或init_boot分区 第二种刷机方式【GKI】不推荐 结语 前言 刷机需…...

【MySQL】表的增删查改(CRUD)(上)

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 CRUD&#xff1a;Create&#xff08;新增数据&#xff09;、Retrieve&#xff08;查询数据&#xff09;、Update&#xff08;修改数据&#xff09;、Delete&#xff08;修改数据…...

测试用例的Story是什么?

测试用例的 Story&#xff08;用户故事&#xff09;是指描述某个功能或场景的具体用户需求&#xff0c;它通常以简短的业务背景用户操作期望结果的方式呈现&#xff0c;使测试人员能够理解测试的目标和价值。用户故事能够帮助团队更好地设计测试用例&#xff0c;确保功能满足用…...

15.4 FAISS 向量数据库实战:构建毫秒级响应的智能销售问答系统

FAISS 向量数据库实战:构建毫秒级响应的智能销售问答系统 关键词:FAISS 向量数据库、销售知识库构建、相似度检索优化、大规模问答匹配、量化索引技术 1. 销售问答场景的向量化挑战与解决方案 1.1 传统检索方案痛点分析 #mermaid-svg-AeVgih79asJb7lb8 {font-family:"…...

Golang笔记——Interface类型

大家好&#xff0c;这里是&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Golang的interface数据结构类型&#xff0c;包括基本实现和使用等。 文章目录 Go 语言中的 interface 详解接口定义实现接口空接口 interface{} 示例&…...

如何查看图片的原始格式

问题描述&#xff1a;请求接口的时候&#xff0c;图片base64接口报错&#xff0c;使用图片url请求正常 排查发现是图片格式的问题&#xff1a; 扩展名可能被篡改&#xff1a;如果文件损坏或扩展名被手动修改&#xff0c;实际格式可能与显示的不同&#xff0c;需用专业工具验证…...

FreiHAND (handposeX-json 格式)数据集-release >> DataBall

FreiHAND &#xff08;handposeX-json 格式&#xff09;数据集-release 注意&#xff1a; 1)为了方便使用&#xff0c;按照 handposeX json 自定义格式存储 2)使用常见依赖库进行调用,降低数据集使用难度。 3)部分数据集获取请加入&#xff1a;DataBall-X数据球(free) 4)完…...

【Rust中级教程】2.8. API设计原则之灵活性(flexible) Pt.4:显式析构函数的问题及3种解决方案

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 说句题外话&#xff0c;这篇文章一共5721个字&#xff0c;是我截至目前写的最长的一篇文章&a…...

LabVIEW Browser.vi 库说明

browser.llb 库位于C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform目录&#xff0c;它是 LabVIEW 平台下用于与网络浏览器相关操作的重要库。该库为 LabVIEW 开发者提供了一系列工具&#xff0c;用于实现网页浏览控制、网页数据获取与交互等功能&a…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...