爬虫学习--6.bs4 库

基本概念

简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:

'''
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。
它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,
所以不需要多少代码就可以写出一个完整的应用程序。
'''

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。BeautifulSoup会帮节省数小时甚至数天的工作时间。你可能在寻找BeautifulSoup3的文档,BeautifulSoup3目前已经停止开发,官网推荐在现在的项目中使用BeautifulSoup4。

bs4的安装

由于 Bautiful Soup 是第三方库,因此需要单独下载,下载方式非常简单,执行以下命令即可安装: pip install bs4 由于BS4 解析页面时需要依赖文档解析器,所以还需要安装 lxml 作为解析库 所以我们还需要安装lxml,安装方式如下: pip install lxml Python 也自带了一个文档解析库 html.parser, 但是其解析速度要稍慢于 lxml。除了上述解析器外,还可以使用 html5lib 解析器,安装方式如下: pip install html5lib 注意: bs4是依赖lxml库的,只有先安装lxml库才可以安装bs4库

文档解析器优缺点

下表列出了主要的解析器,以及它们的优缺点:

推荐使用lxml作为解析器,因为效率更高。在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定。 提示: 如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的。因此我们可以根据情况去选择对应的文档解析器。具体情况具体分析。

bs4的使用

快速开始

创建BS4解析对象是万事开头的第一步,这非常地简单,语法格式如下所示:

1、导入解析包 from bs4 import BeautifulSoup

2、创建beautifulsoup解析对象 soup = BeautifulSoup(html_doc, 'html.parser') 上述代码中,html_doc 表示要解析的文档,而 html.parser 表示解析文档时所用的解析器,此处的解析器也可以是 'lxml' 或者 'html5lib'

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))
# 格式化文档输出
print(soup.prettify())
# 获取title标签内容 <title>The Dormouse's story</title>
print(soup.title) 
# 获取title标签名称: title
print(soup.title.name) 
# title标签里面的文本内容: The Dormouse's story
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对象
Comment : 注释
'''
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对象'''
soup = BeautifulSoup(html_doc, "html.parser")
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  # 获取标签里面的内容
print(r1)

# 获取html中所有的标签内容
r2 = soup.html.strings  # 返回是一个生成器对象用过来获取多个标签内容
print(r2)
for i in r2:
    print(i)

r3 = soup.html.stripped_strings  # 和strings基本一致 但是它可以把多余的空格去掉
print(r3)  # 生成器对象 <generator object Tag._all_strings at 0x000001A73C538AC8>
for i in r3:
    print(i)

搜索文档树

find()
  • find()方法返回搜索到的第一条数据

find_all()
  • find_all()方法以列表形式返回所有的搜索到的标签数据

实例应用

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>
"""

1.获取所有的tr标签;

# 1获取所有的tr标签
trs = soup.find_all("tr")  # 这是个列表过滤器
for tr in trs:
    print(tr)
    print("*" * 150)

2.获取第二个tr标签;

#  获取第二个tr标签
tr = soup.find_all("tr")[1]
print(tr)

3.获取所有的class =even的tr标签

trs = soup.find_all("tr", class_="even")  # 但这里如果直接用class不行 class是作为我们的关键字
# trs = soup.find_all("tr", attrs={"class": "even"})  这两种方式都可
for tr in trs:
    print(tr)
    print("*" * 150)

4.获取所有a标签里面的href属性值;

#  获取所有的a标签的href属性
a_li = soup.find_all("a")
for a in a_li:
    href = a.get("href")
    print(href)

5.获取所有的岗位信息。

trs = soup.find_all("tr")[1:]
for tr in trs:
    tds = tr.find_all("td")
    # print(tds)
    job_name = tds[0].string
    print(job_name)

select()方法

我们也可以通过css选择器的方式来提取数据。但是需要注意的是这里面需要我们掌握css语法CSS 选择器参考手册

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")

# 获取所有的tr标签
# trs = soup.select("tr")
# for i in trs:
#     print(i)

# 获取第二个tr标签
# tr = soup.select("tr")[1]
# print(tr)

# 获取所有class等于even的tr标签
# trs = soup.select(".even")


# 获取所有的a标签的href属性
# a_tags = soup.select("a")
# print(a_tags)
# for a in a_tags:
#     href = a.get("href")
#     print(href)


# 获取所有的职位信息
trs = soup.select("tr")[1:]
print(trs)
for tr in trs:
    print(tr)
    print(list(tr.strings))
    info = list(tr.stripped_strings)[0]
    print(info)

修改文档树

  • 修改tag的名称和属性

  • 修改string  属性赋值,就相当于用当前的内容替代了原来的内容

  • append() 像tag中添加内容,就好像Python的列表的 .append() 方法

  • decompose() 修改删除段落,对于一些没有必要的文章段落我们可以给他删除掉

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 = BeautifulSoup(html_doc, "html.parser")
"""
● 修改tag的名称和属性
● 修改string  属性赋值,就相当于用当前的内容替代了原来的内容
● append() 像tag中添加内容,就好像Python的列表的 .append() 方法
● decompose() 修改删除段落,对于一些没有必要的文章段落我们可以给他删除掉
"""
# 修改tag的名称和属性
tag_p = soup.p
print(tag_p)
tag_p.name = "w"
tag_p["class"] = "content"
print(tag_p)


# 修改string  属性赋值,就相当于用当前的内容替代了原来的内容
tag_p = soup.p
print(tag_p.text)
tag_p.string = "you need python"
print(tag_p.text)

# append() 像tag中添加内容,就好像Python的列表的 .append() 方法
tag_p = soup.p
print(tag_p)
tag_p.append("真的C!")
print(tag_p)

# # decompose() 修改删除段落,对于一些没有必要的文章段落我们可以给他删除掉
r = soup.title
print(r)
r.decompose()
print(soup)

  • 37
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我明白了。那么针对数据清洗和 bs4 解析数据的问题,我可以给您提供一些基本的知识点和操作方法,希望能帮到您。 首先,数据清洗是指对爬取到的原始数据进行处理,去除掉其中的无用信息,使其变得更加规范和易于处理。常见的数据清洗操作包括去除 HTML 标签、去除重复数据、去除空白符等。在 Python 中,有很多用于数据清洗的工具和,如 re、pandas、numpy 等。 其次,bs4 是一种 Python 的,用于解析 HTML 和 XML 文档。它提供了一种简单而灵活的方式来处理这些文档,并可以轻松地从中提取所需的信息。使用 bs4 可以实现 HTML 和 XML 的解析、元素的提取、标签属性的获取等操作。 在具体操作中,我们可以先使用 requests 获取网页源代码,然后使用 bs4 对其进行解析和操作。以获取网页标题为例,代码如下: ``` import requests from bs4 import BeautifulSoup url = 'https://www.baidu.com' r = requests.get(url) r.encoding = 'utf-8' soup = BeautifulSoup(r.text, 'html.parser') print(soup.title.string) ``` 以上代码中,我们首先使用 requests 获取了百度首页的网页源代码,然后使用 BeautifulSoup 对其进行解析,最后提取出了网页标题并打印输出。 当然,bs4 的功能远不止于此,它还可以对 HTML 标签进行筛选、CSS 选择器进行匹配等操作,这些都可以根据具体需求进行学习和实践。 希望这些内容能够帮助到您。如果您还有其他问题或疑惑,可以随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F——

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值