有人说了,有没有更加简单的方式来获取​​Html​​​中的相关数据呢?​​python​​​发言了,当然有了,且看​​BeautifulSoup4​​。

1、BeautifulSoup4是干啥的

python爬虫-13-python获取数据之BeautifulSoup4库(上)_linux

​BeautifulSoup​​是一个可以从HTML或XML文件中提取数据的Python库,它通过转换器实现文档导航,查找,修改文档的方式。

和​​lxml​​​一样,​​Beautiful Soup​​​也是一个​​HTML/XML​​​的解析器,主要的功能也是如何解析和提取​​HTML/XML​​数据。

但是​​BeautifulSoup​​​有一个不可避免的劣势,那就是它是将所有的​​html​​​代码读取到内存中进行操作的,如果你的​​html​​代码格外的大的话,可能不太适合。

2、安装BeautifulSoup

pip install bs4 -i https://pypi.tuna.tsinghua.edu.cn/simple

3、解析工具对比

工具

速度

易难度

lxml

Beautifulsoup

正则

最快

至于要使用哪种方式,那就看事宜情况了,自己衡量下哪种最合适,通过正则的方式的话我们后面也会介绍。

4、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​​代码补全。

5、从示例来了解

首先我们来一个​​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>
"""

(5.1)获取​​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&amp;keywords=python&amp;tid=87&amp;lid=2218" target="_blank">22989-金融云区块链高级研发工程师(深圳)</a></td>
<td>技术类</td>

(5.2)获取​​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&amp;keywords=python&amp;tid=87&amp;lid=2218" target="_blank">22989-金融云区块链高级研发工程师(深圳)</a></td>
<td>技术类</td>
<td>1</td>
<td>深圳</td>
<td>2021-11-25</td>
</tr>

(5.3)获取所有​​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&amp;keywords=python&amp;tid=87&amp;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&amp;keywords=python&amp;tid=87&amp;lid=2218" target="_blank">SNG16-腾讯音乐运营开发工程师(深圳)</a></td>
<td>技术类</td>
<td>2</td>

(5.4)将所有​​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&amp;keywords=python&amp;tid=87&amp;lid=2218" id="test" target="_blank">SNG11-高级业务运维工程师(深圳)</a>]

(5.5)获取所有​​a​​​标签的​​href​​属性

第一种:

剩余内容请转至VX公众号 “运维家” ,回复 “175” 查看。


------ “运维家” ,回复 “175”  ------

------ “运维家” ,回复 “175”  ------

------ “运维家” ,回复 “175”  ------


在Linux中的命令,linux实时线程,linux中tail,如何调用linux的epoll,linux无故多出很多进程,linux怎么打开xls文件,linux怎样用命令打开软件,程序员要不要装linux系统,LINUX通用链表实例;

usb无法安装linux,类似安卓linux,在linux中压缩解压命令,512老电脑linux,linux中退出根目录,linux自定义自启的脚本,linux管理员用户名是,新装的linux网卡配置,linux修改u盘权限失败,c语言linux下开发软件。