Python 页面解析Beautiful Soup库的使用方法

 更新时间:2022年09月09日 08:49:06   作者:小嗷犬  
Beautiful Soup 简称 BS4(其中 4 表示版本号)是一个 Python 中常用的页面解析库,它可以从 HTML 或 XML 文档中快速地提取指定的数据,这篇文章主要介绍了springboot 集成 docsify 实现随身文档 ,需要的朋友可以参考下

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" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Python</a></li>
        <li class="web" id="1"><a href="www.java.com" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Java</a></li>
        <li class="web" id="2"><a href="www.csdn.net" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >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" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Python</a></li>
        <li class="web" id="1"><a href="www.java.com" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Java</a></li>
        <li class="web" id="2"><a href="www.csdn.net" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >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" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Python</a></li>
        <li class="web" id="1"><a href="www.java.com" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Java</a></li>
        <li class="web" id="2"><a href="www.csdn.net" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >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" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Python</a></li>
        <li class="web" id="web1"><a href="www.java.com" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Java</a></li>
        <li class="web" id="web2"><a href="www.csdn.net" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >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}张图片下载成功')

这就是本文的全部内容了,快去动手试试吧!

到此这篇关于Python 页面解析Beautiful Soup库的使用的文章就介绍到这了,更多相关Python  Beautiful Soup库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Windows下Sqlmap环境安装教程详解

    Windows下Sqlmap环境安装教程详解

    这篇文章主要介绍了Windows下Sqlmap环境安装,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • python如何对实例属性进行类型检查

    python如何对实例属性进行类型检查

    这篇文章主要为大家详细介绍了python如何对实例属性进行类型检查,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Python海象运算符的用法教程

    Python海象运算符的用法教程

    Python 海象运算符是在 PEP 572 中提出,并在 Python3.8 版本并入和发布。本文就来为大家详细讲讲Python海象运算符的用法,感兴趣的可以了解一下
    2022-07-07
  • Python+redis通过限流保护高并发系统

    Python+redis通过限流保护高并发系统

    这篇文章主要介绍了Python+redis通过限流保护高并发系统,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 浅谈Python numpy创建空数组的问题

    浅谈Python numpy创建空数组的问题

    今天遇到一个小小的问题,是关于numpy创建空数组,今天特地整理了这篇文章,文中作出了非常详细的介绍,对正在学习python的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • Python 限制线程的最大数量的方法(Semaphore)

    Python 限制线程的最大数量的方法(Semaphore)

    今天小编就为大家分享一篇Python 限制线程的最大数量的方法(Semaphore),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • yolov5特征图可视化的使用步骤

    yolov5特征图可视化的使用步骤

    这篇文章主要介绍了yolov5特征图可视化,本文通过实例代码给大家介绍yolov5特征图可视化使用方法,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • python中的sort方法使用详解

    python中的sort方法使用详解

    这篇文章主要介绍了python中的sort方法,需要的朋友可以参考下
    2014-07-07
  • 利用python实现周期财务统计可视化

    利用python实现周期财务统计可视化

    这篇文章主要给大家介绍了关于如何利用python实现周期财务统计可视化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 如何使用python切换hosts文件

    如何使用python切换hosts文件

    这篇文章主要介绍了如何使用python切换hosts文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论