目录
Beautiful Soup 库一般被称为bs4库,支持Python3,是我们写爬虫非常好的第三方库。因用起来十分的简便流畅。所以也被人叫做“美味汤”。目前bs4库的最新版本是4.40。下文会介绍该库的最基本的使用,具体详细的细节还是要看:[官方文档](Beautiful Soup Documentation)
Python的强大之处就在于他作为一个开源的语言,有着许多的开发者为之开发第三方库,这样我们开发者在想要实现某一个功能的时候,只要专心实现特定的功能,其他细节与基础的部分都可以交给库来做。bs4库 就是我们写爬虫强有力的帮手。
事实上,bs4库 是解析、遍历、维护、“标签树“的功能库。
BS4的4中对象
- Tag对象:是html中的一个标签,用BeautifulSoup就能解析出来Tag的具体内容,具体的格式为‘soup.name‘,其中name是html下的标签。
- BeautifulSoup对象:整个html文本对象,可当作Tag对象
- NavigableString对象:标签内的文本对象
- Comment对象:是一个特殊的NavigableString对象,如果html标签内存在注释,那么它可以过滤掉注释符号保留注释文本
- 最常用的还是BeautifulSoup对象和Tag对象
基本使用
# 1 安装
# pip install bs4
# pip install lxml
# 2 导包
# from bs4 import BeautifulSoup
# 3 创建bs对象
# soup = BeautifulSoup(网页源码,解析器)
# 4 调用需要的方法提取数据 find\findall
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<b><!-- Elsie --></b>
<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>
"""
# 类型为<class 'bs4.BeautifulSoup'> bs对象
soup = BeautifulSoup(html_doc,'lxml')
# 格式化
# print(soup.prettify())
# 提取出第一个a标签
# 类型为<class 'bs4.element.Tag'> 标签
a = soup.a # a是标签名
print(a)
# print(type(a))
# 打印标签名
print(a.name)
# 提取出标签之间的文本
# 类型为 <class 'bs4.element.NavigableString'> 文本数据
print(a.string)
str1 = a.string + 'aaa'
print(str1)
# 提取出标签的属性
print(a.get('class')[0])
print(a['class'])
# 注释
b = soup.b
print(b.string)
# BeautifulSoup(html_doc,'lxml') <class 'bs4.BeautifulSoup'> bs对象
# soup.a <class 'bs4.element.Tag'> 标签
# a.string <class 'bs4.element.NavigableString'> 文本数据
查找标签
# 取别名
from bs4 import BeautifulSoup as bs
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" id="aaa">
<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 = bs(html,'lxml')
# 1 提取出所有tr标签
tr_list = soup.find_all('tr')
# for tr in tr_list:
# print(tr)
# print('-'*100)
# 2 提取出第二tr标签
# print(tr_list[1])
# 3 提取出class='even'的tr标签 limit设置提取数量
# tr_list1 = soup.find_all('tr',class_='even',limit=3)
# for tr in tr_list1:
# print(tr)
# print('-' * 100)
# tr_list1 = soup.find_all('tr',attrs={'class':'even','id':'aaa'})
# for tr in tr_list1:
# print(tr)
# print('-' * 100)
# 4 获取所有a标签的href属性
# a_list = soup.find_all('a')
# for a in a_list:
# # print(a['href'])
# print(a.get('href'))
# print('-' * 100)
# 5 获取所有职位信息
a_list1 = soup.find_all('a',target="_blank")
# for a in a_list1:
# print(a.string)
# print('-' * 100)
用CSV保存数据
import csv
persons = [
{'name': '笔记本', 'age': 18, 'height': 175},
{'name': '张同学', 'age': 18, 'height': 175},
{'name': '杨同学', 'age': 18, 'height': 175},
]
# newline='' 去除空行 encoding='utf-8-sig'去除乱码
headers = ['name','age','height']
with open('item.csv','w',encoding='utf-8-sig',newline='')as f:
# 把普通的open方法变为写入csv的方法
# DictWriter多传入一个表头参数
dict_writer = csv.DictWriter(f,headers)
# dict_writer.writeheader() 写入表头
dict_writer.writeheader()
# 写入二维数据
dict_writer.writerows(persons)