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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 简称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}张图片下载成功')
这就是本文的全部内容了,快去动手试试吧!
目录
相关文章
|
5天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
34 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
2天前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
2天前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
1天前
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
70 9
|
8天前
|
监控 算法 安全
内网桌面监控软件深度解析:基于 Python 实现的 K-Means 算法研究
内网桌面监控软件通过实时监测员工操作,保障企业信息安全并提升效率。本文深入探讨K-Means聚类算法在该软件中的应用,解析其原理与实现。K-Means通过迭代更新簇中心,将数据划分为K个簇类,适用于行为分析、异常检测、资源优化及安全威胁识别等场景。文中提供了Python代码示例,展示如何实现K-Means算法,并模拟内网监控数据进行聚类分析。
30 10
|
26天前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
52 17
|
2月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
126 80
|
24天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码

热门文章

最新文章