Python 页面解析:Beautiful Soup库的使用

简介: 简称BS4(其中 4 表示版本号)是一个 Python 中常用的页面解析库,它可以从 HTML 或 XML 文档中快速地提取指定的数据。相比于之前讲过的lxml库,更加简单易用,不像正则和 XPath 需要刻意去记住很多特定语法,尽管那样会效率更高更直接。对大多数 Python 使用者来说,好用会比高效更重要。库为第三方库,需要我们通过pipBS4解析页面时需要依赖文档解析器,所以还需要一个文档解析器。Python 自带了一个文档解析库, 但是其解析速度稍慢,所以我们结合上篇内容(
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页: 小嗷犬的博客
🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
🥭本文内容:Python 页面解析:Beautiful Soup库的使用

@TOC


1.Beautiful Soup库简介

Beautiful Soup 简称 BS4(其中 4 表示版本号)是一个 Python 中常用的页面解析库,它可以从 HTML 或 XML 文档中快速地提取指定的数据。

相比于之前讲过的 lxml 库,Beautiful Soup 更加简单易用,不像正则和 XPath 需要刻意去记住很多特定语法,尽管那样会效率更高更直接。

对大多数 Python 使用者来说,好用会比高效更重要。

Beautiful Soup库为第三方库,需要我们通过pip命令安装:

pip install bs4
BS4 解析页面时需要依赖文档解析器,所以还需要一个文档解析器。
Python 自带了一个文档解析库 html.parser, 但是其解析速度稍慢,所以我们结合上篇内容( Python 文档解析:lxml库的使用),安装 lxml 作为文档解析库:
pip install lxml

2.Beautiful Soup库方法介绍

使用 bs4 的初始化操作,是用文本创建一个 BeautifulSoup 对象,并指定文档解析器:
from bs4 import BeautifulSoup

html_str = '''
<div>
    <ul>
        <li class="web" id="0"><a href="www.python.org">Python</a></li>
        <li class="web" id="1"><a href="www.java.com">Java</a></li>
        <li class="web" id="2"><a href="www.csdn.net">CSDN</a></li>
    </ul>
</div>
'''

soup = BeautifulSoup(html_str, 'lxml')
# prettify()用于格式化输出HTML/XML文档
print(soup.prettify())
bs4 提供了 find_all()find()两个常用的查找方法它们的用法如下:

2.1 find_all()

find_all() 方法用来搜索当前 tag 的所有子节点,并判断这些节点是否符合过滤条件,最后以列表形式将符合条件的内容返回,语法格式如下:
find_all(name, attrs, recursive, text, limit)

参数说明:

  • name:查找所有名字为 name 的 tag 标签,字符串对象会被自动忽略。
  • attrs:按照属性名和属性值搜索 tag 标签,注意由于 class 是 Python 的关键字,所以要使用 "class_"。
  • recursive:find_all() 会搜索 tag 的所有子孙节点,设置 recursive=False 可以只搜索 tag 的直接子节点。
  • text:用来搜文档中的字符串内容,该参数可以接受字符串 、正则表达式 、列表、True。
  • limit:由于 find_all() 会返回所有的搜索结果,这样会影响执行效率,通过 limit 参数可以限制返回结果的数量。
from bs4 import BeautifulSoup

html_str = '''
<div>
    <ul>
        <li class="web" id="0"><a href="www.python.org">Python</a></li>
        <li class="web" id="1"><a href="www.java.com">Java</a></li>
        <li class="web" id="2"><a href="www.csdn.net">CSDN</a></li>
    </ul>
</div>
'''
soup = BeautifulSoup(html_str, 'lxml')

print(soup.find_all("li"))
print(soup.find_all("a"))
print(soup.find_all(text="Python"))
上面程序使用 find_all() 方法,来查找页面中所有的 <li></li>标签、 <a></a>标签和 "Python"字符串内容。

2.2 find()

find() 方法与 find_all() 方法极其相似,不同之处在于 find() 仅返回第一个符合条件的结果,因此 find() 方法也没有 limit参数,语法格式如下:
find(name, attrs, recursive, text)
除了和 find_all() 相同的使用方式以外, bs4find() 方法提供了一种简写方式:
soup.find("li")
soup.li
这两行代码的功能相同,都是返回第一个 <li></li>标签,完整程序:
from bs4 import BeautifulSoup

html_str = '''
<div>
    <ul>
        <li class="web" id="0"><a href="www.python.org">Python</a></li>
        <li class="web" id="1"><a href="www.java.com">Java</a></li>
        <li class="web" id="2"><a href="www.csdn.net">CSDN</a></li>
    </ul>
</div>
'''
soup = BeautifulSoup(html_str, 'lxml')

print(soup.li)
print(soup.a)
上面的程序会打印出第一个 <li></li>标签和第一个 <a></a>标签。

2.3 select()

bs4 支持大部分的 CSS 选择器,比如常见的标签选择器、类选择器、id 选择器,以及层级选择器。 Beautiful Soup 提供了一个 select() 方法,通过向该方法中添加选择器,就可以在 HTML 文档中搜索到与之对应的内容。

应用如下:

from bs4 import BeautifulSoup

html_str = '''
<div>
    <ul>
        <li class="web" id="web0"><a href="www.python.org">Python</a></li>
        <li class="web" id="web1"><a href="www.java.com">Java</a></li>
        <li class="web" id="web2"><a href="www.csdn.net">CSDN</a></li>
    </ul>
</div>
'''
soup = BeautifulSoup(html_str, 'lxml')
#根据元素标签查找
print(soup.select('body'))
#根据属性选择器查找
print(soup.select('a[href]'))
#根据类查找
print(soup.select('.web'))
#后代节点查找
print(soup.select('div ul'))
#根据id查找
print(soup.select('#web1'))
更多方法及其详细使用说明,请参见官方文档:
https://beautiful-soup-4.readthedocs.io/en/latest/

3.代码实例

学会了 Beautiful Soup ,让我们试着改写一下上次的爬虫代码吧:
import os
import sys
import requests
from bs4 import BeautifulSoup

x = requests.get('https://www.csdn.net/')

soup = BeautifulSoup(x.text, 'lxml')

img_list = soup.select('img[src]')

# 创建img文件夹
os.chdir(os.path.dirname(sys.argv[0]))

if not os.path.exists('img'):
    os.mkdir('img')
    print('创建文件夹成功')
else:
    print('文件夹已存在')

# 下载图片
for i in range(len(img_list)):
    item = img_list[i]['src']
    img = requests.get(item).content
    if item.endswith('jpg'):
        with open(f'./img/{i}.jpg', 'wb') as f:
            f.write(img)
    elif item.endswith('jpeg'):
        with open(f'./img/{i}.jpeg', 'wb') as f:
            f.write(img)
    elif item.endswith('png'):
        with open(f'./img/{i}.png', 'wb') as f:
            f.write(img)
    else:
        print(f'第{i + 1}张图片格式不正确')
        continue
    print(f'第{i + 1}张图片下载成功')
这就是本文的全部内容了,快去动手试试吧!
目录
相关文章
|
11天前
|
存储 缓存 JavaScript
python实战篇:利用request库打造自己的翻译接口
python实战篇:利用request库打造自己的翻译接口
26 1
python实战篇:利用request库打造自己的翻译接口
|
22天前
|
Web App开发 Python
在ModelScope中,你可以使用Python的浏览器自动化库
在ModelScope中,你可以使用Python的浏览器自动化库
15 2
|
22天前
|
算法 Linux 开发者
CMake深入解析:打造高效动态链接库路径设置
CMake深入解析:打造高效动态链接库路径设置
44 0
|
17天前
|
存储 缓存 算法
Python中collections模块的deque双端队列:深入解析与应用
在Python的`collections`模块中,`deque`(双端队列)是一个线程安全、快速添加和删除元素的双端队列数据类型。它支持从队列的两端添加和弹出元素,提供了比列表更高的效率,特别是在处理大型数据集时。本文将详细解析`deque`的原理、使用方法以及它在各种场景中的应用。
|
22天前
|
缓存 算法 C语言
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
45 0
|
1天前
|
JSON API 数据格式
python的request库如何拿到json的返回值
python的request库如何拿到json的返回值
4 0
|
4天前
|
SQL API 数据库
Python中的SQLAlchemy框架:深度解析与实战应用
【4月更文挑战第13天】在Python的众多ORM(对象关系映射)框架中,SQLAlchemy以其功能强大、灵活性和易扩展性脱颖而出,成为许多开发者首选的数据库操作工具。本文将深入探讨SQLAlchemy的核心概念、功能特点以及实战应用,帮助读者更好地理解和使用这一框架。
|
13天前
|
数据采集 网络协议 API
python中其他网络相关的模块和库简介
【4月更文挑战第4天】Python网络编程有多个流行模块和库,如requests提供简洁的HTTP客户端API,支持多种HTTP方法和自动处理复杂功能;Scrapy是高效的网络爬虫框架,适用于数据挖掘和自动化测试;aiohttp基于asyncio的异步HTTP库,用于构建高性能Web应用;Twisted是事件驱动的网络引擎,支持多种协议和异步编程;Flask和Django分别是轻量级和全栈Web框架,方便构建不同规模的Web应用。这些工具使网络编程更简单和高效。
|
17天前
|
数据采集 数据挖掘 Python
Python中collections模块的Counter计数器:深入解析与应用
在Python的`collections`模块中,`Counter`是一个强大且实用的工具,它主要用于计数可哈希对象。无论是统计单词出现的频率,还是分析数据集中元素的分布情况,`Counter`都能提供快速且直观的结果。本文将深入解析`Counter`计数器的原理、用法以及它在实际应用中的价值。
|
21天前
|
算法 IDE Linux
【CMake 小知识】CMake中的库目标命名和查找策略解析
【CMake 小知识】CMake中的库目标命名和查找策略解析
98 1

推荐镜像

更多