BeautifulSoup 是什么?

Beautiful Soup 是一个能够从 HTML 或 XML 文件中提取数据的 Python 库。,最主要的功用是从网页抓取数据。能够经过自己喜欢的转换器完成惯用的文档导航,查找,修正文档的办法。

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

bs4的装置:

能够在 Pycharm 中,输入以下句子:然后可根据提示进行装置。

from bs4 import BeautifulSoup

留意:bs4 是依靠 lxml 库的,只有先装置 lxml 库才能够装置bs4库*

文档解析器优缺点:

【Python】数据解析之BeautifulSoup4

引荐运用 lxml 作为解析器,因为效率更高。

bs4 的运用:

  1. 导入解析包;
  2. 创建 beautifulsoup 解析目标;
  3. 打印对应内容即可;

代码实例:

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="https://juejin.im/post/7248859336734621753/http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="https://juejin.im/post/7248859336734621753/http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="https://juejin.im/post/7248859336734621753/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)

select() 办法:

选择性获取对应的数据,经过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="https://juejin.im/post/7248859336734621753/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="https://juejin.im/post/7248859336734621753/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="https://juejin.im/post/7248859336734621753/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="https://juejin.im/post/7248859336734621753/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="https://juejin.im/post/7248859336734621753/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="https://juejin.im/post/7248859336734621753/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="https://juejin.im/post/7248859336734621753/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="https://juejin.im/post/7248859336734621753/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="https://juejin.im/post/7248859336734621753/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="https://juejin.im/post/7248859336734621753/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 tr in trs:
    print(f'获取一切的tr标签:{tr}')
# 获取第二个tr标签,下标从0开始,经过索引值取值
secondTr = soup.select('tr')[1]
print(f'获取第二个tr标签,下标从0开始,经过索引值取值:{secondTr}')
# 获取一切的class=even的tr标签
evenTr = soup.select('.even')
print(f'获取一切的class=even的tr标签:{evenTr}')
# 获取一切的a标签的href特点
hrefATrs = soup.select('a')
for i in hrefATrs:
    hrefATr = i.get('href')
    print(f'获取一切的a标签的href特点:{hrefATr}')
# 获取一切的职位信息
jobTrs = soup.select('tr')[1:]  # 过滤第一个tr内容(表头:职位称号...)
# print(jobTrs)
for tr in jobTrs:
    # print(tr)
    # print(tr.strings)   # 回来是一个生成器目标用来获取多个标签内容  <generator object Tag._all_strings at 0x1030afe40>
    print(list(tr.strings))  # 回来是一个生成器目标用来获取多个标签内容,回来的数据带有杂质 ['\n', 'SNG16-腾讯音乐事务运维工程师(深圳)', '\n', '技能类', '\n', '1', '\n', '深圳', '\n', '2017-11-25', '\n']
    # info = list(tr.stripped_strings)  # 取列表的一切值
    # print(info)  # ['SNG16-腾讯音乐事务运维工程师(深圳)', '技能类', '1', '深圳', '2017-11-25']
    info = list(tr.stripped_strings)[0]  # 取列表的第一个值,并去除杂质数据
    print(info)  # TEG11-高档AI开发工程师(深圳)

修正文档树:

修正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="https://juejin.im/post/7248859336734621753/http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="https://juejin.im/post/7248859336734621753/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, 'lxml')
# 修正tag的称号和特点;
tagP = soup.p
print(f'这是修正前:{tagP}')
tagP.name = 'aa'
tagP['class'] = 'changeClassName'
print(f'这是修正后:{tagP}')
# 修正string特点赋值,相当于用当时的内容替代了本来的内容
tagCont = soup.p
tagCont.string = '今日35度,坐标:上海...'
print(tagCont)
# append():向tag中添加内容,类似于python的列表的.append()办法
tagAppendCont = soup.p
tagAppendCont.append('快成铁板烧了。')
print(tagAppendCont)
# decompose():修正删去阶段,关于一些没有必要的文章阶段,能够删去
tagDelCont = soup.title
print(tagDelCont)  # <title>The Dormouse's story</title>
tagDelCont.decompose()
print(soup)  # 留意:回来soup目标的值,而不是删去后的tagDelCont