0

0

python beautifulsoup4模块怎么用

王林

王林

发布时间:2023-05-11 22:31:04

|

1596人浏览过

|

来源于亿速云

转载

一、BeautifulSoup4 基础知识补充

beautifulsoup4 是一款 python 解析库,主要用于解析 html 和 xml,在爬虫知识体系中解析 html 会比较多一些,

该库安装命令如下:

pip install beautifulsoup4

BeautifulSoup 在解析数据时,需依赖第三方解析器,常用解析器与优势如下所示:

  • python 标准库 html.parser:python 内置标准库,容错能力强;

  • lxml 解析器:速度快,容错能力强;

    立即学习Python免费学习笔记(深入)”;

  • html5lib:容错性最强,解析方式与浏览器一致。

接下来用一段自定义的 HTML 代码来演示 beautifulsoup4 库的基本使用,测试代码如下:

<html>
  <head>
    <title>测试bs4模块脚本</title>
  </head>
  <body>
    <h2>橡皮擦的爬虫课</h2>
    <p>用一段自定义的 HTML 代码来演示</p>
  </body>
</html>

使用 BeautifulSoup 对其进行简单的操作,包含实例化 BS 对象,输出页面标签等内容。

from bs4 import BeautifulSoup
text_str = """<html>
	<head>
		<title>测试bs4模块脚本</title>
	</head>
	<body>
		<h2>橡皮擦的爬虫课</h2>
		<p>用1段自定义的 HTML 代码来演示</p>
		<p>用2段自定义的 HTML 代码来演示</p>
	</body>
</html>
"""
# 实例化 Beautiful Soup 对象
soup = BeautifulSoup(text_str, "html.parser")
# 上述是将字符串格式化为 Beautiful Soup 对象,你可以从一个文件进行格式化
# soup = BeautifulSoup(open('test.html'))
print(soup)
# 输入网页标题 title 标签
print(soup.title)
# 输入网页 head 标签
print(soup.head)

# 测试输入段落标签 p
print(soup.p) # 默认获取第一个

我们可以通过 BeautifulSoup 对象,直接调用网页标签,这里存在一个问题,通过 BS 对象调用标签只能获取排在第一位置上的标签,如上述代码中,只获取到了一个 p 标签,如果想要获取更多内容,请继续阅读。

学习到这里,我们需要了解 BeautifulSoup 中的 4 个内置对象:

  • BeautifulSoup:基本对象,整个 HTML 对象,一般当做 Tag 对象看即可;

  • Tag:标签对象,标签就是网页中的各个节点,例如 title,head,p;

  • NavigableString:标签内部字符串;

  • Comment:注释对象,爬虫里面使用场景不多。

下述代码为你演示这几种对象出现的场景,注意代码中的相关注释:

from bs4 import BeautifulSoup
text_str = """<html>
	<head>
		<title>测试bs4模块脚本</title>
	</head>
	<body>
		<h2>橡皮擦的爬虫课</h2>
		<p>用1段自定义的 HTML 代码来演示</p>
		<p>用2段自定义的 HTML 代码来演示</p>
	</body>
</html>
"""
# 实例化 Beautiful Soup 对象
soup = BeautifulSoup(text_str, "html.parser")
# 上述是将字符串格式化为 Beautiful Soup 对象,你可以从一个文件进行格式化
# soup = BeautifulSoup(open('test.html'))
print(soup)
print(type(soup))  # <class 'bs4.BeautifulSoup'>
# 输入网页标题 title 标签
print(soup.title)
print(type(soup.title)) # <class 'bs4.element.Tag'>
print(type(soup.title.string)) # <class 'bs4.element.NavigableString'>
# 输入网页 head 标签
print(soup.head)

对于 Tag 对象,有两个重要的属性,是 name 和 attrs

from bs4 import BeautifulSoup
text_str = """<html>
	<head>
		<title>测试bs4模块脚本</title>
	</head>
	<body>
		<h2>橡皮擦的爬虫课</h2>
		<p>用1段自定义的 HTML 代码来演示</p>
		<p>用2段自定义的 HTML 代码来演示</p>
		<a href="http://www.csdn.net" rel="external nofollow"  rel="external nofollow" >CSDN 网站</a>
	</body>
</html>
"""
# 实例化 Beautiful Soup 对象
soup = BeautifulSoup(text_str, "html.parser")
print(soup.name) # [document]
print(soup.title.name) # 获取标签名 title
print(soup.html.body.a) # 可以通过标签层级获取下层标签
print(soup.body.a) # html 作为一个特殊的根标签,可以省略
print(soup.p.a) # 无法获取到 a 标签
print(soup.a.attrs) # 获取属性

上述代码演示了获取 name 属性和 attrs 属性的用法,其中 attrs 属性得到的是一个字典,可以通过键获取对应的值。

获取标签的属性值,在 BeautifulSoup 中,还可以使用如下方法:

print(soup.a["href"])
print(soup.a.get("href"))

获取 NavigableString 对象 获取了网页标签之后,就要获取标签内文本了,通过下述代码进行。

print(soup.a.string)

除此之外,你还可以使用 text 属性和 get_text() 方法获取标签内容。

print(soup.a.string)
print(soup.a.text)
print(soup.a.get_text())

还可以获取标签内所有文本,使用 strings 和 stripped_strings 即可。

print(list(soup.body.strings)) # 获取到空格或者换行
print(list(soup.body.stripped_strings)) # 去除空格或者换行

扩展标签/节点选择器之遍历文档树

直接子节点

标签(Tag)对象的直接子元素,可以使用 contents 和 children 属性获取。

from bs4 import BeautifulSoup
text_str = """<html>
	<head>
		<title>测试bs4模块脚本</title>
	</head>
	<body>
		<div id="content">
			<h2>橡皮擦的爬虫课<span>最棒</span></h2>
            <p>用1段自定义的 HTML 代码来演示</p>
            <p>用2段自定义的 HTML 代码来演示</p>
            <a href="http://www.csdn.net" rel="external nofollow"  rel="external nofollow" >CSDN 网站</a>
		</div>
        <ul class="nav">
            <li>首页</li>
            <li>博客</li>
            <li>专栏课程</li>
        </ul>

	</body>
</html>
"""
# 实例化 Beautiful Soup 对象
soup = BeautifulSoup(text_str, "html.parser")
# contents 属性获取节点的直接子节点,以列表的形式返回内容
print(soup.div.contents) # 返回列表
# children 属性获取的也是节点的直接子节点,以生成器的类型返回
print(soup.div.children) # 返回 <list_iterator object at 0x00000111EE9B6340>

请注意以上两个属性获取的都是直接子节点,例如 h2 标签内的后代标签 span ,不会单独获取到。

如果希望将所有的标签都获取到,使用 descendants 属性,它返回的是一个生成器,所有标签包括标签内的文本都会单独获取。

print(list(soup.div.descendants))

其它节点的获取(了解即可,即查即用)

  • parent 和 parents:直接父节点和所有父节点;

  • next_siblingnext_siblingsprevious_siblingprevious_siblings:分别表示下一个兄弟节点、下面所有兄弟节点、上一个兄弟节点、上面所有兄弟节点,由于换行符也是一个节点,所有在使用这几个属性时,要注意一下换行符;

  • next_elementnext_elementsprevious_elementprevious_elements:这几个属性分别表示上一个节点或者下一个节点,注意它们不分层次,而是针对所有节点,例如上述代码中 div 节点的下一个节点是 h2,而 div 节点的兄弟节点是 ul

    聚好用AI
    聚好用AI

    可免费AI绘图、AI音乐、AI视频创作,聚集全球顶级AI,一站式创意平台

    下载

文档树搜索相关函数

第一个要学习的函数就是 find_all() 函数,原型如下所示:

find_all(name,attrs,recursive,text,limit=None,**kwargs)
  • name:该参数为 tag 标签的名字,例如 find_all('p') 是查找所有的 p 标签,可接受标签名字符串、正则表达式与列表;

  • attrs:传入的属性,该参数可以字典的形式传入,例如 attrs={'class': 'nav'},返回的结果是 tag 类型的列表;

上述两个参数的用法示例如下:

print(soup.find_all('li')) # 获取所有的 li
print(soup.find_all(attrs={'class': 'nav'})) # 传入 attrs 属性
print(soup.find_all(re.compile("p"))) # 传递正则,实测效果不理想
print(soup.find_all(['a','p'])) # 传递列表
  • recursive:调用 find_all () 方法时,BeautifulSoup 会检索当前 tag 的所有子孙节点,如果只想搜索 tag 的直接子节点,可以使用参数 recursive=False,测试代码如下:

print(soup.body.div.find_all(['a','p'],recursive=False)) # 传递列表
  • text:可以检索文档中的文本字符串内容,与 name 参数的可选值一样,text 参数接受标签名字符串、正则表达式、 列表;

print(soup.find_all(text='首页')) # ['首页']
print(soup.find_all(text=re.compile("^首"))) # ['首页']
print(soup.find_all(text=["首页",re.compile('课')])) # ['橡皮擦的爬虫课', '首页', '专栏课程']
  • limit:可以用来限制返回结果的数量;

  • kwargs:如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作 tag 的属性来搜索。这里要按 class 属性搜索,因为 class 是 python 的保留字,需要写作 class_,按 class_ 查找时,只要一个 CSS 类名满足即可,如需多个 CSS 名称,填写顺序需要与标签一致。

print(soup.find_all(class_ = 'nav'))
print(soup.find_all(class_ = 'nav li'))

还需要注意网页节点中,有些属性在搜索中不能作为kwargs参数使用,比如html5 中的 data-*属性,需要通过attrs参数进行匹配。

与 find_all()方法用户基本一致的其它方法清单如下:
  • find():函数原型find( name , attrs , recursive , text , **kwargs ),返回一个匹配元素;

  • find_parents(),find_parent():函数原型 find_parent(self, name=None, attrs={}, **kwargs),返回当前节点的父级节点;

  • find_next_siblings(),find_next_sibling():函数原型 find_next_sibling(self, name=None, attrs={}, text=None, **kwargs),返回当前节点的下一兄弟节点;

  • find_previous_siblings(),find_previous_sibling():同上,返回当前的节点的上一兄弟节点;

  • find_all_next(),find_next(),find_all_previous () ,find_previous ():函数原型 find_all_next(self, name=None, attrs={}, text=None, limit=None, **kwargs),检索当前节点的后代节点。

CSS 选择器 该小节的知识点与pyquery有点撞车,核心使用select()方法即可实现,返回数据是列表元组。

  • 通过标签名查找,soup.select("title")

  • 通过类名查找,soup.select(".nav")

  • 通过 id 名查找,soup.select("#content")

  • 通过组合查找,soup.select("div#content")

  • 通过属性查找,soup.select("div[id='content'")soup.select("a[href]")

在通过属性查找时,还有一些技巧可以使用,例如:

  • ^=:可以获取以 XX 开头的节点:

print(soup.select('ul[class^="na"]'))
  • *=:获取属性包含指定字符的节点:

print(soup.select('ul[class*="li"]'))

二、爬虫案例

BeautifulSoup 的基础知识掌握之后,在进行爬虫案例的编写,就非常简单了,本次要采集的目标网站 ,该目标网站有大量的艺术二维码,可以供设计大哥做参考。

python beautifulsoup4模块怎么用

下述应用到了 BeautifulSoup 模块的标签检索与属性检索,完整代码如下:

from bs4 import BeautifulSoup
import requests
import logging
logging.basicConfig(level=logging.NOTSET)
def get_html(url, headers) -> None:
    try:
        res = requests.get(url=url, headers=headers, timeout=3)
    except Exception as e:
        logging.debug("采集异常", e)

    if res is not None:
        html_str = res.text
        soup = BeautifulSoup(html_str, "html.parser")
        imgs = soup.find_all(attrs={'class': 'lazy'})
        print("获取到的数据量是", len(imgs))
        datas = []
        for item in imgs:
            name = item.get('alt')
            src = item["src"]
            logging.info(f"{name},{src}")
            # 获取拼接数据
            datas.append((name, src))
        save(datas, headers)
def save(datas, headers) -> None:
    if datas is not None:
        for item in datas:
            try:
                # 抓取图片
                res = requests.get(url=item[1], headers=headers, timeout=5)
            except Exception as e:
                logging.debug(e)

            if res is not None:
                img_data = res.content
                with open("./imgs/{}.jpg".format(item[0]), "wb+") as f:
                    f.write(img_data)
    else:
        return None
if __name__ == '__main__':
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
    }
    url_format = "http://www.9thws.com/#p{}"
    urls = [url_format.format(i) for i in range(1, 2)]
    get_html(urls[0], headers)

本次代码测试输出采用的 logging 模块实现,效果如下图所示。 测试仅采集了 1 页数据,如需扩大采集范围,只需要修改 main 函数内页码规则即可。 ==代码编写过程中,发现数据请求是类型是 POST,数据返回格式是 JSON,所以本案例仅作为 BeautifulSoup 的上手案例吧== 

python beautifulsoup4模块怎么用

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

89

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

276

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

59

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

99

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

105

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

230

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

619

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

173

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号