【Python爬虫实战】深入解析BeautifulSoup4的强大功能与用法

  🌈个人主页:https://blog.csdn.net/2401_86688088?type=blog
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

目录

前言

一、BeautifulSoup4的介绍和安装

(一)基本功能和特点

(二)使用示例

(三)安装

二、搜索文档树

(一)find() 方法

(二)find_all() 方法

(三)select() 方法

(四)find_parent() 和 find_parents() 方法

(五)find_next_sibling() 和 find_previous_sibling() 方法

(六)find_next() 和 find_all_next() 方法

(七)find_previous() 和 find_all_previous() 方法

(八)应用示例

三、CSS选择器

(一)ID 选择器

(二)类选择器

(三)标签选择器

(四)层级选择器

(五)属性选择器

(六)多个选择器

(七)伪类选择器

(八)直接使用文本内容查找

(九)示例

四、总结


前言

在大数据时代,网页抓取变得越来越普遍。BeautifulSoup4 是一款高效的 Python 库,特别适合用于从 HTML 和 XML 文档中提取数据。无论是快速搜索特定元素,还是解析复杂的网页结构,BeautifulSoup4 都能轻松完成。本文将带你深入了解 BeautifulSoup4 的功能与使用方法,并通过实用示例帮助你掌握这款工具。


一、BeautifulSoup4的介绍和安装

BeautifulSoup4 是一个 Python 库,主要用于从 HTML 和 XML 文档中提取数据。它为解析 HTML 和 XML 提供了便捷的工具,可以轻松地遍历、搜索和修改文档的内容。BeautifulSoup 适合用来处理结构复杂或者格式不一致的网页,是进行网页抓取时非常有用的工具。

(一)基本功能和特点

功能和特点如下:

  • HTML 解析:BeautifulSoup4 支持多种解析器,比如 Python 自带的 html.parser、lxml 的 HTML 解析器和 HTML5lib。解析器的选择会影响性能和功能。

  • 数据提取:可以使用标签、CSS 选择器、属性等多种方式来定位页面中的元素,并且可以轻松提取标签的文本内容或属性值。

  • 文档修复:BeautifulSoup4 会自动修复不完整的 HTML 文档,使其成为一个合适的树形结构,方便进一步操作。

  • 导航文档树:提供了丰富的属性和方法来遍历 HTML 树,快速定位和访问指定的节点。例如,可以使用 findfind_all 方法来查找特定的标签,还可以使用 next_siblingprevious_sibling 等方法进行兄弟节点导航。

(二)使用示例

假设我们有一个 HTML 文档,如下:

<html><head><title>页面标题</title></head><body><h1>主标题</h1><p class="content">这是一个段落。</p><a href="http://example.com">点击这里</a></body>
</html>

我们可以使用 BeautifulSoup4 解析并提取特定元素:

from bs4 import BeautifulSouphtml_doc = """
<html><head><title>页面标题</title></head><body><h1>主标题</h1><p class="content">这是一个段落。</p><a href="http://example.com">点击这里</a></body>
</html>
"""# 使用 html.parser 创建 BeautifulSoup 对象
soup = BeautifulSoup(html_doc, 'html.parser')# 获取标题内容
title = soup.title.string
print(title)  # 输出: 页面标题# 获取第一个 <p> 标签的内容
paragraph = soup.find('p', class_='content').text
print(paragraph)  # 输出: 这是一个段落。# 获取链接地址
link = soup.find('a')['href']
print(link)  # 输出: http://example.com

(三)安装

可以通过 pip 进行安装:

pip install beautifulsoup4

二、搜索文档树

在 BeautifulSoup4 中,搜索文档树是解析和提取数据的核心功能。BeautifulSoup 提供了多种方法来搜索 HTML 文档的树结构,让你轻松找到特定的标签或属性。下面是一些常用的搜索方法:

(一)find() 方法

  • find() 方法用于查找文档中的第一个符合条件的标签。

  • 常用来查找单个特定标签,比如第一个 <p><div> 标签。

tag = soup.find('p')  # 查找第一个 <p> 标签

使用属性查找

可以通过 class_id 等属性进一步限定查找条件。

tag = soup.find('p', class_='content')  # 查找 class 为 'content' 的第一个 <p> 标签

(二)find_all() 方法

  • find_all() 方法用于查找文档中的所有符合条件的标签,并返回一个列表。

  • 可以用它来查找页面中的所有特定标签,比如所有的 <a> 标签。

tags = soup.find_all('a')  # 查找所有 <a> 标签

限制返回数量

可以通过 limit 参数限制返回的结果数量。

tags = soup.find_all('a', limit=2)  # 查找最多两个 <a> 标签

使用正则表达式查找

可以结合 re 模块使用正则表达式来查找符合特定模式的标签或属性。

import retags = soup.find_all('p', class_=re.compile('^content'))  # 查找 class 以 'content' 开头的所有 <p> 标签

(三)select() 方法

  • select() 方法使用 CSS 选择器来查找元素,是一种更灵活的查找方式。

  • 支持 ID 选择器(#)、类选择器(.)、层级选择器(>)等。

tags = soup.select('.content')  # 查找所有 class 为 'content' 的元素
tag = soup.select_one('#main')  # 查找 ID 为 'main' 的第一个元素

嵌套选择器

可以通过嵌套 CSS 选择器来精确定位元素。

tags = soup.select('div > p.content')  # 查找 <div> 内所有 class 为 'content' 的 <p> 标签

(四)find_parent()find_parents() 方法

  • find_parent() 用于查找当前标签的第一个符合条件的父节点。

  • find_parents() 用于查找所有符合条件的父节点。

parent = tag.find_parent('div')  # 查找第一个 <div> 类型的父节点

(五)find_next_sibling()find_previous_sibling() 方法

  • find_next_sibling() 用于查找当前标签的下一个兄弟标签。

  • find_previous_sibling() 用于查找当前标签的上一个兄弟标签。

next_sibling = tag.find_next_sibling('p')  # 查找下一个 <p> 标签兄弟节点

(六)find_next()find_all_next() 方法

  • find_next() 用于查找文档树中下一个符合条件的标签。

  • find_all_next() 用于查找文档树中所有符合条件的标签。

next_tag = tag.find_next('p')  # 查找文档树中下一个 <p> 标签
all_next_tags = tag.find_all_next('p')  # 查找文档树中所有后续的 <p> 标签

(七)find_previous()find_all_previous() 方法

previous_tag = tag.find_previous('p')  # 查找文档树中上一个 <p> 标签
all_previous_tags = tag.find_all_previous('p')  # 查找文档树中所有前面的 <p> 标签

(八)应用示例

from bs4 import BeautifulSouphtml_doc = """
<html><body><div id="main"><h1 class="title">标题</h1><p class="content">这是第一个段落。</p><p class="content">这是第二个段落。</p><a href="http://example.com/first">第一个链接</a><a href="http://example.com/second">第二个链接</a></div></body>
</html>
"""soup = BeautifulSoup(html_doc, 'html.parser')# 查找第一个 <h1> 标签
h1_tag = soup.find('h1')
print(h1_tag.text)  # 输出: 标题# 查找所有 class 为 'content' 的 <p> 标签
p_tags = soup.find_all('p', class_='content')
for p in p_tags:print(p.text)  # 输出每个 <p> 标签的文本内容# 使用 CSS 选择器查找 <a> 标签
a_tags = soup.select('div#main a')
for a in a_tags:print(a['href'])  # 输出每个链接的 href 属性

三、CSS选择器

在 BeautifulSoup4 中,select()select_one() 方法允许使用 CSS 选择器来查找和提取 HTML 元素。这些方法支持多种 CSS 选择器语法,包括类、ID、层级、伪类等,提供了更灵活的方式来选择页面中的特定元素。下面是常用的 CSS 选择器以及它们的用法:

(一)ID 选择器

使用 # 符号选择具有特定 ID 的元素。

# 查找 ID 为 'main' 的元素
element = soup.select_one('#main')

(二)类选择器

使用 . 符号选择具有特定类名的元素。

# 查找所有 class 为 'content' 的元素
elements = soup.select('.content')

(三)标签选择器

直接使用标签名称选择所有特定标签的元素。

# 查找所有 <p> 标签
paragraphs = soup.select('p')

(四)层级选择器

后代选择器(空格):用于选择某个元素内部的所有指定标签。

# 查找 <div> 内的所有 <p> 标签
elements = soup.select('div p')

子代选择器>):用于选择某个元素的直接子元素。

# 查找 <div> 内的直接子 <p> 标签
elements = soup.select('div > p')

(五)属性选择器

使用方括号 [] 选择具有特定属性的元素。

# 查找所有具有 href 属性的 <a> 标签
links = soup.select('a[href]')

指定属性值

还可以指定属性的值,例如选择特定链接地址的 <a> 标签:

# 查找 href 属性为 'http://example.com' 的 <a> 标签
link = soup.select_one('a[href="http://example.com"]')

(六)多个选择器

并集选择器:使用逗号 , 选择多个不同的元素类型。

# 查找所有 <h1> 标签和 class 为 'content' 的元素
elements = soup.select('h1, .content')

交集选择器:使用多个选择器组合,例如类和标签组合。

# 查找所有 class 为 'content' 的 <p> 标签
elements = soup.select('p.content')

(七)伪类选择器

CSS 中的伪类(如 :first-child:nth-child(n) 等)也适用于 select()。不过,这些选择器在 BeautifulSoup 中的支持有限,因为它主要用于静态 HTML 树。

第一个子元素:选择某个元素的第一个子元素。

# 查找 <div> 内的第一个 <p> 标签
first_paragraph = soup.select_one('div p:first-child')

第 N 个子元素:选择某个元素的第 N 个子元素。

# 查找 <div> 内的第二个 <p> 标签
second_paragraph = soup.select_one('div p:nth-child(2)')

(八)直接使用文本内容查找

虽然 CSS 本身不支持直接通过文本查找,但在 BeautifulSoup 中,可以先使用 CSS 选择器找到标签,再通过 .text 属性获取其内容。

# 查找所有 <p> 标签并输出其文本
paragraphs = soup.select('p')
for p in paragraphs:print(p.text)

(九)示例

以下示例展示了如何使用不同的 CSS 选择器来选择特定元素:

from bs4 import BeautifulSouphtml_doc = """
<html><body><div id="main"><h1 class="title">标题</h1><p class="content">这是第一个段落。</p><p class="content">这是第二个段落。</p><a href="http://example.com/first">第一个链接</a><a href="http://example.com/second" class="external">第二个链接</a></div></body>
</html>
"""soup = BeautifulSoup(html_doc, 'html.parser')# 使用 ID 选择器查找 <div> 标签
main_div = soup.select_one('#main')
print(main_div)  # 输出 <div id="main">...</div># 使用类选择器查找所有 class 为 'content' 的 <p> 标签
content_paragraphs = soup.select('.content')
for p in content_paragraphs:print(p.text)  # 输出每个 <p> 标签的文本内容# 使用属性选择器查找所有带有 href 属性的 <a> 标签
links = soup.select('a[href]')
for link in links:print(link['href'])  # 输出每个链接的 href 属性# 使用层级选择器查找 <div> 内的所有 <a> 标签
div_links = soup.select('div#main a')
for link in div_links:print(link.text)  # 输出每个链接的文本

CSS 选择器在 BeautifulSoup4 中提供了非常灵活且强大的选择方式,可以更精准地定位页面中的特定元素,是网页解析和数据抓取时的得力工具。


四、总结

BeautifulSoup4 提供了丰富的功能,可以方便地处理和解析网页内容。无论是使用简单的 find() 方法查找单个元素,还是通过 CSS 选择器实现复杂的元素选择,BeautifulSoup4 都展现了极大的灵活性和强大性。希望这篇文章能帮助你更好地理解和应用 BeautifulSoup4,为你的网页数据抓取项目增添更多可能性!

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

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

相关文章

Servlet[springmvc]的Servlet.init()引发异常

报错&#xff1a; 原因之一&#xff1a; web.xml配置文件中监听器导入依赖项错误

新颖的 setTimeout() 替代方案

在前端开发中&#xff0c;长时间运行的JavaScript任务一直是一个棘手的问题。它们会导致页面无响应&#xff0c;影响用户体验。传统上&#xff0c;开发者使用setTimeout()来分割长任务&#xff0c;但这种方法存在明显的缺陷。最近&#xff0c;Chrome 129引入了一种新的、更高效…

如何搭建激光稳频的闭环控制系统

半导体激光器稳频简介 简介 窄线宽连续激光器广泛应用于原子、分子以及物理光学领域&#xff0c;在精密测量设备中有着举足轻重的作用。那些并不带有波长稳频技术的激光器&#xff0c;其短时间稳定性不适合很多应用。本文档将会给您介绍一种简单而强大的主动稳频技术&#xff0…

不收费的数据恢复工具有哪些好用?快来看这五款:

大家好&#xff0c;今天我来跟大家分享一下使用不收费数据恢复软件的一些心得和体验&#xff1b;数据丢失是一件非常让人头疼的事情&#xff0c;尤其是对于那些重要文件来说&#xff1b;幸好&#xff0c;现在市面上有不少不收费的数据恢复软件可以帮助我们找回丢失的数据。接下…

【C++笔试强训】如何成为算法糕手Day11

学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 游游的水果大礼包 思路 代码实现&#xff1a; 买卖股票的最好时机(二) 思路&#xff1a; 代码实现&#xff1a; 倒置字符串 思路&#xff1a; 代码实现&#xf…

101、QT摄像头录制视频问题

视频和音频录制类QMediaRecorder QMediaRecorder 通过摄像头和音频输入设备进行录像。 注意: 使用Qt多媒体模块的摄像头相关类无法在Windows平台上进行视频录制&#xff0c;只能进行静态图片抓取但是在Linux平台上可以实现静态图片抓取和视频录制。 Qt多媒体模块的功能实现是依…

React远程组件

什么是远程组件&#xff1f; 远程组件指的是从远程服务器动态加载的组件&#xff0c;这些组件可以是React、Vue等框架的组件。 为什么需要远程组件 本质上就是为了解决复用问题&#xff0c;那引出新的问题有几种公共项目代码复用方式&#xff1f; Git仓库 将公共代码单独抽…

CTFHUB技能树之XSS——DOM反射

开启靶场&#xff0c;打开链接&#xff1a; 直接指明是DOM反射型的XSS漏洞 右键查看页面源代码&#xff0c;Ctrl F关键词”CTFHub is very“&#xff1a; 可以看到存在xss漏洞 不过得先闭合一下&#xff1a; 闭合例子如下&#xff1a; ;</sCrIpT><sCRiPt sRC//xs.pe/…

YOLOv11改进-卷积-空间和通道重构卷积SCConv

本篇文章将介绍一个新的改进模块——SCConv&#xff08;小波空间和通道重构卷积&#xff09;&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。为了减少YOLOv11模型的空间和通道维度上的冗余&#xff0c;我们引入空间和通道重构卷积。首先&#xff0c;…

Java 入门基础篇15 - java构造方法以及认识新的关键字

一 今日目标 构造方法static关键字代码块math类package关键字import关键字 二 构造方法概述 2.1 构造方法描述 构造方法是一个特殊方法&#xff0c;作用是创建对象&#xff0c;对对象进行初始化。 ​ 如&#xff1a; 对对象中的成员进行初始化值 2.1 构造方法的特征 1、方…

【C语言】循环结构-for循环

循环结构&#xff1a;计算机最擅长的事情就是做简单重复的工作 通过控制循环变量&#xff0c;是否满足循环条件来调整循环次数。 for(初始化;循环条件;循环控制) {循环体; }#include <stdio.h> #include <math.h> /* 功能&#xff1a;循环结构&#xff08;for&…

前端开发攻略---使用ocr识别图片进行文字提取功能

1、引入资源 通过链接引用 <script src"https://cdn.bootcdn.net/ajax/libs/tesseract.js/5.1.0/tesseract.min.js"></script> npm或其他方式下载 npm i tesseract 2、示例 <!DOCTYPE html> <html lang"en"><head><meta…

Oracle分布式数据库的安装遇到的问题【已解决】:找不到scott用户、出现【INS-30014】错误、oracle登录适配器错误

Oracle分布式数据库的安装遇到的问题【已解决】&#xff1a;找不到scott用户、出现【INS-30014】错误、oracle登录适配器错误 安装oracle19c软件利用Database Configuration Assistant&#xff0c;创建orcl数据库第一步&#xff1a;在开始菜单找到Oracle&#xff0c;点击“Data…

Go语言基础学习(Go安装配置、基础语法)·

一、简介及安装教程 1、为什么学习Go&#xff1f; 简单好记的关键词和语法&#xff1b;更高的效率&#xff1b;生态强大&#xff1b;语法检查严格&#xff0c;安全性高&#xff1b;严格的依赖管理&#xff0c; go mod 命令&#xff1b;强大的编译检查、严格的编码规范和完整的…

Flink 06 聚合操作入门学习,真不难

抛砖引玉 让你统计1小时内每种商品的销售额&#xff0c;用Flink 该怎么实现。 还是让你统计1小时内每种商品的销售额&#xff0c;但是要过滤掉退款的订单&#xff0c;用Flink 该怎么实现。 学了本文两个操作&#xff0c;不信你还不会。 AggregateFunction ❝ 通常用于对数据…

Android从上帝视角来看PackageManagerService

戳蓝字“牛晓伟”关注我哦&#xff01; 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章&#xff0c;技术文章也可以有温度。 前言 阅读该篇之前&#xff0c;建议先阅读下面的系列文章&#xff1a; Android深入理解包管理–PackageManagerService和它的“小伙伴…

HTB:Bashed[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many open TCP ports are listening on Bashed? 2.What is the relative path on the webserver to a folder that contains phpbash.php? 3.What user is the webserver running as on Bashed? 执行命令&#xff1a;whoami 4.S…

GraphRAG 与 RAG 的比较分析,收藏这一篇就够了!!!

检索增强生成&#xff08;RAG&#xff09;技术概述 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称 RAG&#xff09;是一种旨在提升大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;性能的技术方法。其核心思想是通过整…

5 -《本地部署开源大模型》在Ubuntu 22.04系统下ChatGLM3-6B高效微调实战

在Ubuntu 22.04系统下ChatGLM3-6B高效微调实战 无论是在单机单卡&#xff08;一台机器上只有一块GPU&#xff09;还是单机多卡&#xff08;一台机器上有多块GPU&#xff09;的硬件配置上启动ChatGLM3-6B模型&#xff0c;其前置环境配置和项目文件是相同的。如果大家对配置过程还…

如何给手机换ip地址

在当今数字化时代&#xff0c;IP地址作为设备在网络中的唯一标识&#xff0c;扮演着举足轻重的角色。然而&#xff0c;有时出于隐私保护、网络访问需求或其他特定原因&#xff0c;我们可能需要更改手机的IP地址。本文将详细介绍几种实用的方法&#xff0c;帮助您轻松实现手机IP…