AIOps 一场颠覆传统运维的盛筵
819
2022-11-06
python爬虫-13-python获取数据之BeautifulSoup4库(上)
有人说了,有没有更加简单的方式来获取
Html
中的相关数据呢?python
发言了,当然有了,且看BeautifulSoup4
。
BeautifulSoup
是一个可以从HTML或XML文件中提取数据的Python库,它通过转换器实现文档导航,查找,修改文档的方式。
和lxml
一样,Beautiful Soup
也是一个HTML/XML
的解析器,主要的功能也是如何解析和提取HTML/XML
数据。
但是BeautifulSoup
有一个不可避免的劣势,那就是它是将所有的html
代码读取到内存中进行操作的,如果你的html
代码格外的大的话,可能不太适合。
pip install bs4 -i https://pypi.tuna.tsinghua.edu.cn/simple
工具 | 速度 | 易难度 |
---|---|---|
lxml | 快 | 中 |
Beautifulsoup | 慢 | 易 |
正则 | 最快 | 难 |
至于要使用哪种方式,那就看事宜情况了,自己衡量下哪种最合适,通过正则的方式的话我们后面也会介绍。
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>
</tbody>
</table>
"""
Jier = BeautifulSoup(html, 'lxml')
print(Jier.prettify())
输出结果如下:
<html>
<body>
<table cellpadding="0" cellspacing="0" class="tablelist">
<tbody>
<tr class="h">
<td class="l" width="374">
职位名称
</td>
<td>
职位类别
</td>
<td>
人数
</td>
<td>
地点
</td>
<td>
发布时间
</td>
</tr>
</tbody>
</table>
</body>
</html>
我们从输出结果来看的话,BeautifulSoup
可以筛选出所有的html
代码,并进行html
代码补全。
首先我们来一个html
代码的示例,后面我们的操作都在此html
代码的基础上进行操作。
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>2021-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>2021-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>2021-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>2021-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>2021-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>2021-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>2021-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>2021-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>2021-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>2021-11-24</td>
</tr>
</tbody>
</table>
"""
html
tr
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find_all('tr')
for tr in Suner:
print(tr)
print('=' * 20)
输出结果如下(篇幅问题,只写部分信息):
<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 href="position_detail.php?id=33824&keywords=python&tid=87&lid=2218" target="_blank">22989-金融云区块链高级研发工程师(深圳)</a></td>
<td>技术类</td>
html
tr
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find_all('tr', limit=2)[1]
print(Suner)
输出结果如下:
<tr class="even">
<td class="l square"><a href="position_detail.php?id=33824&keywords=python&tid=87&lid=2218" target="_blank">22989-金融云区块链高级研发工程师(深圳)</a></td>
<td>技术类</td>
<td>1</td>
<td>深圳</td>
<td>2021-11-25</td>
</tr>
class
even
tr
这里我们有两种写法,无所谓哪种更好,还是看情况来选择;
第一种:
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find_all('tr', class_='even') # 为什么class后面要加一个下划线呢,因为class是python自身的关键字,为了区分,bs4自带了可以
print("一共找到{}个class等于even的tr标签。".format(len(Suner)))
print(Suner)
第二种:
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find_all('tr', attrs={'class': 'even'})
print("一共找到{}个class等于even的tr标签。".format(len(Suner)))
print(Suner)
输出结果如下(篇幅问题,只写部分信息):
一共找到5个class等于even的tr标签。
[<tr class="even">
<td class="l square"><a href="position_detail.php?id=33824&keywords=python&tid=87&lid=2218" target="_blank">22989-金融云区块链高级研发工程师(深圳)</a></td>
<td>技术类</td>
<td>1</td>
<td>深圳</td>
<td>2021-11-25</td>
</tr>, <tr class="even">
<td class="l square"><a href="position_detail.php?id=31236&keywords=python&tid=87&lid=2218" target="_blank">SNG16-腾讯音乐运营开发工程师(深圳)</a></td>
<td>技术类</td>
<td>2</td>
id
test
class
test
a
根据5.3
来看的话,它本身也有两种写法,和5.3
类似,我们再试着来一遍;
第一种:
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find_all('a', id='test', class_='test')
print(Suner)
第二种:
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find_all('a', attrs={'id': 'test', 'class': 'test'})
print(Suner)
输出结果如下:
[<a class="test" href="position_detail.php?id=34511&keywords=python&tid=87&lid=2218" id="test" target="_blank">SNG11-高级业务运维工程师(深圳)</a>]
a
href
第一种:
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
# 先获取到所有a标签放到一个list中
Suner = Jier.find_all('a')
for i in Suner:
print(i['href'])
第二种:
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find_all('a')
for i in Suner:
print(i.attrs['href'])
输出结果如下(篇幅问题,只写部分信息):
position_detail.php?id=33824&keywords=python&tid=87&lid=2218
position_detail.php?id=29938&keywords=python&tid=87&lid=2218
position_detail.php?id=31236&keywords=python&tid=87&lid=2218
position_detail.php?id=31235&keywords=python&tid=87&lid=2218
由于我们的示例
Html
代码中的第一个tr
标签是无用信息,故而需要排除掉他;且我们的信息都在
tr
标签下面的td
标签,所以我们筛选两次,如下:
第一种:
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find_all('tr')[1:]
Message_List = []
for i in Suner:
# Message_dict = {}
Tds = i.find_all('td')
Title = Tds[0].string
Type = Tds[1].string
Sort = Tds[2].string
Address = Tds[3].string
Time = Tds[4].string
Message_dict = {
'Title': Title,
'Type': Type,
'Sort': Sort,
'Address': Address,
'Time': Time
}
Message_List.append(Message_dict)
print(Message_List)
第二种:
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find_all('tr')
Message_List = []
for i in Suner:
# 将该html代码中所有值提取出来
Tds = list(i.stripped_strings)
Message_dict = {
'Title': Tds[0],
'Type': Tds[1],
'Sort': Tds[2],
'Address': Tds[3],
'Time': Tds[4]
}
Message_List.append(Message_dict)
print(Message_List)
输出结果为:
[{'Title': '职位名称', 'Type': '职位类别', 'Sort': '人数', 'Address': '地点', 'Time': '发布时间'}, {'Title': '22989-金融云区块链高级研发工程师(深圳)', 'Type': '技术类', 'Sort': '1', 'Address': '深圳', 'Time': '2021-11-25'}, {'Title': '22989-金融云高级后台开发', 'Type': '技术类', 'Sort': '2', 'Address': '深圳', 'Time': '2021-11-25'}, {'Title': 'SNG16-腾讯音乐运营开发工程师(深圳)', 'Type': '技术类', 'Sort': '2', 'Address': '深圳', 'Time': '2021-11-25'}, {'Title': 'SNG16-腾讯音乐业务运维工程师(深圳)', 'Type': '技术类', 'Sort': '1', 'Address': '深圳', 'Time': '2021-11-25'}, {'Title': 'TEG03-高级研发工程师(深圳)', 'Type': '技术类', 'Sort': '1', 'Address': '深圳', 'Time': '2021-11-24'}, {'Title': 'TEG03-高级图像算法研发工程师(深圳)', 'Type': '技术类', 'Sort': '1', 'Address': '深圳', 'Time': '2021-11-24'}, {'Title': 'TEG11-高级AI开发工程师(深圳)', 'Type': '技术类', 'Sort': '4', 'Address': '深圳', 'Time': '2021-11-24'}, {'Title': '15851-后台开发工程师', 'Type': '技术类', 'Sort': '1', 'Address': '深圳', 'Time': '2021-11-24'}, {'Title': '15851-后台开发工程师', 'Type': '技术类', 'Sort': '1', 'Address': '深圳', 'Time': '2021-11-24'}, {'Title': 'SNG11-高级业务运维工程师(深圳)', 'Type': '技术类', 'Sort': '1', 'Address': '深圳', 'Time': '2021-11-24'}]
至此,本位结束,相关内容每日更新哦。
往期推荐linux搭建mongodb数据库副本集五分钟学会linux磁盘共享之nfs技术centos7/linux编译安装mysql8最新版
发表评论
暂时没有评论,来抢沙发吧~