Python数据解析之BeautifulSoup4的用法详解

 更新时间:2023年06月27日 08:35:29   作者:素年凉音  
Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库,这篇文章主要来和大家介绍一下BeautifulSoup4的用法,需要的可以参考一下

BeautifulSoup 是什么

Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库。,最主要的功能是从网页抓取数据。能够通过自己喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。

注:BeautifulSoup3目前已经停止开发,官网推荐在现在的项目中使用BeautifulSoup4

bs4的安装

可以在 Pycharm 中,输入以下语句:然后可根据提示进行安装。

from bs4 import BeautifulSoup

注意:bs4 是依赖 lxml 库的,只有先安装 lxml 库才可以安装bs4库*

文档解析器优缺点

推荐使用 lxml 作为解析器,因为效率更高。

bs4 的使用

  • 导入解析包;
  • 创建 beautifulsoup 解析对象;
  • 打印对应内容即可;

代码实例:

from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
# 创建一个 soup 对象
soup = BeautifulSoup(html_doc, 'lxml')
print(soup, type(soup))  # <class 'bs4.BeautifulSoup'>
# 格式化文档输出
print(soup.prettify())
# 获取 title 标签的名称 title
print(soup.title.name)  # title
# 获取 title 标签内容
print(soup.title)  # <title>The Dormouse's story</title>
# title 标签里面的文本内容
print(soup.title.string)
# 获取 p 段落
print(soup.p)

bs4的对象种类

  • tag : html中的标签。可以通过 BeautifulSoup 分析 Tag 的具体内容,具体格式为:soup.name,其中 name 是html 下的标签。
  • NavigableString : 标签中的文本对象。
  • BeautifulSoup : 整个html文本对象,可以作为Tag对象。
  • Comment:特殊的 NavigableString 对象,如果 html标签中有注释,则可过滤注释符号并保留注释文本。

代码实例

from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
"""
tag:标签
NavigableString:可导航的字符串,标签中的文本对象
beautifulSoup:bs对象,整个 html 文本对象
Comment:注释,如果 html 标签中有注释,则可过滤注释符号并保留注释文本
"""
# html_doc 表示要解析的文档,而 html.parser 表示解析文档时所用的解析器
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup)
""" tag:标签"""
print(type(soup.title))
print(type(soup.p))
print(type(soup.a))
""" NavigableString,可导航的字符串"""
from bs4.element import NavigableString
print(type(soup.title.string))   # 标签下的文本数据
"""beautifulSoup,bs对象"""
print(type(soup))
""" Comment:注释"""
html = "<b><!--好好学习,天天向上--></b>"
soup2 = BeautifulSoup(html, 'html.parser')
print(soup2.b.string, type(soup2.b.string))

遍历文档树

遍历子节点

  • contents 返回的是一个所有子节点的列表(了解)
  • children 返回的是一个子节点的迭代器(了解)
  • descendants 返回的是一个生成器遍历子子孙孙(了解)
  • string 获取标签里面的内容(掌握)
  • strings 返回是一个生成器对象用过来获取多个标签内容(掌握)
  • stripped_strings 和strings 基本一致 但是它可以把多余的空格去掉(掌握)

遍历父节点

  • parent 直接获得父节点
  • parents 获取所有的父节点

遍历兄弟节点

  • next_sibling,下一个兄弟结点
  • previous_sibling,上一个兄弟结点
  • next_siblings,下一个所有兄弟结点
  • previous_siblings,上一个所有兄弟结点

代码实例

from bs4 import BeautifulSoup
html_doc = """
<html>
<head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">
Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'lxml')
r1 = soup.title.string  # 获取单个标签里面的内容  The Dormouse's story
# 获取html中所有的标签中的内容
r2 = soup.html.strings  # 返回是一个生成 generator对象,用过来获取多个标签内容
for i in r2:
    print(i)
r3 = soup.html.stripped_strings  # 获取html中所有的标签中的内容,并去掉多余的空格
for i in r3:
    print("---", i)

搜索文档树

  • find():返回搜索到的第一条数据;
  • find_all():以列表形式返回所有的搜索到的标签数据;

代码实例

from bs4 import BeautifulSoup
html = """
<table class="tablelist" cellpadding="0" cellspacing="0">
    <tbody>
        <tr class="h">
            <td class="l" width="374">职位名称</td>
            <td>职位类别</td>
            <td>人数</td>
            <td>地点</td>
            <td>发布时间</td>
        </tr>
        <tr class="even">
            <td class="l square"><a target="_blank" href="position_detail.php?id=33824&keywords=python&tid=87&lid=2218">22989-金融云区块链高级研发工程师(深圳)</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-25</td>
        </tr>
        <tr class="odd">
            <td class="l square"><a target="_blank" href="position_detail.php?id=29938&keywords=python&tid=87&lid=2218">22989-金融云高级后台开发</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2017-11-25</td>
        </tr>
        <tr class="even">
            <td class="l square"><a target="_blank" href="position_detail.php?id=31236&keywords=python&tid=87&lid=2218">SNG16-腾讯音乐运营开发工程师(深圳)</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2017-11-25</td>
        </tr>
        <tr class="odd">
            <td class="l square"><a target="_blank" href="position_detail.php?id=31235&keywords=python&tid=87&lid=2218">SNG16-腾讯音乐业务运维工程师(深圳)</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-25</td>
        </tr>
        <tr class="even">
            <td class="l square"><a target="_blank" href="position_detail.php?id=34531&keywords=python&tid=87&lid=2218">TEG03-高级研发工程师(深圳)</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
        <tr class="odd">
            <td class="l square"><a target="_blank" href="position_detail.php?id=34532&keywords=python&tid=87&lid=2218">TEG03-高级图像算法研发工程师(深圳)</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
        <tr class="even">
            <td class="l square"><a target="_blank" href="position_detail.php?id=31648&keywords=python&tid=87&lid=2218">TEG11-高级AI开发工程师(深圳)</a></td>
            <td>技术类</td>
            <td>4</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
        <tr class="odd">
            <td class="l square"><a target="_blank" href="position_detail.php?id=32218&keywords=python&tid=87&lid=2218">15851-后台开发工程师</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
        <tr class="even">
            <td class="l square"><a target="_blank" href="position_detail.php?id=32217&keywords=python&tid=87&lid=2218">15851-后台开发工程师</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
        <tr class="odd">
            <td class="l square"><a id="test" class="test" target='_blank' href="position_detail.php?id=34511&keywords=python&tid=87&lid=2218">SNG11-高级业务运维工程师(深圳)</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-24</td>
        </tr>
    </tbody>
</table>
"""
soup = BeautifulSoup(html, 'lxml')
print(soup, type(soup))
# 获取所有的 tr 标签
trs = soup.find_all("tr")
for tr in trs:
    print(tr)
    print('*' * 30)
# 获取第二个 tr 标签
tr = soup.find_all('tr')[1]
print(tr)
# 排除第一个tr值(通过切片的方式)
jobMsg = soup.find_all('tr')[1:]
print(jobMsg)
# 获取所有的 class = even 的 tr 标签:
# trs = soup.find_all('tr', class_='even')  # class为关键字,不能直接用作变量名
trs = soup.find_all('tr', attrs={"class": "even"})  # 效果同上,如果有多个值,在后面添加即可,推荐
for tr in trs:
    print(tr)
    print('--' * 44)
# 获取所有a标签里面的 href 属性值:
allA = soup.find_all('a')
for a in allA:
    href = a.get('href')
    print(href)
# 获取所有的岗位信息
trs = soup.find_all('tr')[1:]   # 把第一个的表头去掉
# print(trs)
for tr in trs:
    tds = tr.find_all('td')   # 找到所有的 td
    jobName = tds[0].string   # 获取文本数据,如果数据狠多,可以使用strings
    print(jobName)

以上就是Python数据解析之BeautifulSoup4的用法详解的详细内容,更多关于Python BeautifulSoup4的资料请关注脚本之家其它相关文章!

相关文章

  • 在Keras中实现保存和加载权重及模型结构

    在Keras中实现保存和加载权重及模型结构

    这篇文章主要介绍了在Keras中实现保存和加载权重及模型结构,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 一文详解Python中的时间和日期处理

    一文详解Python中的时间和日期处理

    在Python开发中,我们经常需要处理日期和时间,Python提供了一些内置模块,如datetime、time和calendar,这些模块让我们能够轻松地获取、操作和格式化日期和时间,本文将介绍如何在Python中使用这些模块进行日期和时间的处理
    2023-06-06
  • python中判断数字是否为质数的实例讲解

    python中判断数字是否为质数的实例讲解

    在本篇文章里小编给大家分享了关于python中判断数字是否为质数的实例讲解内容,有兴趣的朋友们可以学习下。
    2020-12-12
  • 解决python3输入的坑——input()

    解决python3输入的坑——input()

    这篇文章主要介绍了解决python3输入的坑——input(),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Python如何统计函数调用的耗时

    Python如何统计函数调用的耗时

    这篇文章主要为大家详细介绍了如何使用Python实现统计函数调用的耗时,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • Python pandas轴旋转stack和unstack的使用说明

    Python pandas轴旋转stack和unstack的使用说明

    这篇文章主要介绍了Python pandas轴旋转stack和unstack的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python中使用select模块实现非阻塞的IO

    Python中使用select模块实现非阻塞的IO

    这篇文章主要介绍了Python中使用select模块实现非阻塞的IO,本文使用一个简单聊天室程序讲解Python中的select模块使用,需要的朋友可以参考下
    2015-02-02
  • python3中替换python2中cmp函数的实现

    python3中替换python2中cmp函数的实现

    这篇文章主要介绍了python3替换python2中cmp函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python curl2pyreqs 生成接口脚本实战教程

    python curl2pyreqs 生成接口脚本实战教程

    这篇文章主要介绍了python curl2pyreqs 生成接口脚本实战教程,首先下载 curl2pyreqs 库,打开调试模式,在Network这里获取接口的cURL,需要的朋友可以参考下
    2023-10-10
  • pytorch动态网络以及权重共享实例

    pytorch动态网络以及权重共享实例

    今天小编就为大家分享一篇pytorch动态网络以及权重共享实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01

最新评论