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

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

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, 但是其解析速度稍慢,安装 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}张图片下载成功')
这就是本文的全部内容了,快去动手试试吧!
目录
相关文章
|
数据采集 JSON API
深入解析:使用 Python 爬虫获取淘宝店铺所有商品接口
本文介绍如何使用Python结合淘宝开放平台API获取指定店铺所有商品数据。首先需注册淘宝开放平台账号、创建应用并获取API密钥,申请接口权限。接着,通过构建请求、生成签名、调用接口(如`taobao.items.search`和`taobao.item.get`)及处理响应,实现数据抓取。代码示例展示了分页处理和错误处理方法,并强调了调用频率限制、数据安全等注意事项。此技能对开发者和数据分析师极具价值。
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1135 29
|
11月前
|
数据采集 搜索推荐 API
Python 原生爬虫教程:京东商品列表页面数据API
京东商品列表API是电商大数据分析的重要工具,支持开发者、商家和研究人员获取京东平台商品数据。通过关键词搜索、分类筛选、价格区间等条件,可返回多维度商品信息(如名称、价格、销量等),适用于市场调研与推荐系统开发。本文介绍其功能并提供Python请求示例。接口采用HTTP GET/POST方式,支持分页、排序等功能,满足多样化数据需求。
|
12月前
|
数据采集 安全 数据挖掘
淘宝天猫宝贝详情页面商品评论采集接口全解析
淘宝天猫商品评论采集接口为电商数据挖掘提供了重要工具。通过分析海量评论,消费者可获取购买决策参考,商家能优化产品与服务,市场研究者则能洞察行业趋势与竞品表现。该接口支持Python请求,助力开发者构建智能分析应用,推动电商生态中各方价值提升。使用时需遵守平台规则,确保数据安全与合法利用。
354 15
|
11月前
|
数据采集 存储 NoSQL
如何避免Python爬虫重复抓取相同页面?
如何避免Python爬虫重复抓取相同页面?
|
数据采集 存储 调度
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
在Python网页抓取领域,BeautifulSoup和Scrapy是两款备受推崇的工具。BeautifulSoup易于上手、灵活性高,适合初学者和简单任务;Scrapy则是一个高效的爬虫框架,内置请求调度、数据存储等功能,适合大规模数据抓取和复杂逻辑处理。两者结合使用可以发挥各自优势,例如用Scrapy进行请求调度,用BeautifulSoup解析HTML。示例代码展示了如何在Scrapy中设置代理IP、User-Agent和Cookies,并使用BeautifulSoup解析响应内容。选择工具应根据项目需求,简单任务选BeautifulSoup,复杂任务选Scrapy。
354 1
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
机器学习/深度学习 数据采集 自然语言处理
基于Python的情感分析与情绪识别技术深度解析
本文探讨了基于Python的情感分析与情绪识别技术,涵盖基础概念、实现方法及工业应用。文中区分了情感分析与情绪识别的核心差异,阐述了从词典法到深度学习的技术演进,并通过具体代码展示了Transformers架构在细粒度情感分析中的应用,以及多模态情绪识别框架的设计。此外,还介绍了电商评论分析系统的构建与优化策略,包括领域自适应训练和集成学习等方法。未来,随着深度学习和多模态数据的发展,该技术将更加智能与精准。
750 1
|
数据采集 存储 数据库连接
Requests与BeautifulSoup:高效解析网页并下载资源
Requests与BeautifulSoup:高效解析网页并下载资源

推荐镜像

更多