11.BeautifulSoup安装并解析爬取数据
- 1.简介
- 2.安装
- 3.基本使用
- 3.1 获取第一个div标签的html代码
- 3.2 获取第一个li标签
- 3.3 获取第一个li标签内容
- 3.4 返回第一个li的字典,里面是多个属性和值
- 3.5 查看第一个li返回的数据类型
- 3.6 根据属性,获取标签的属性值,返回值为列表 不存在就报错
- 3.7 获取具体属性 获取最近的第一个属性 不存在就返回None
- 3.8 给class属性赋值,此时属性值由列表转换为字符串
- 4.BS4实战
- 4.1 查找第一个符合条件的标签
- 4.2 查找所有符合条件的标签
- 4.3 使用CSS选择器查找标签
- 4.4 遍历所有文本内容
1.简介
BeautifulSoup是Python中的一个用于解析HTML和XML文档的库,它提供了一种Pythonic的方式来遍历文档、搜索元素以及修改文档的功能。在网络爬虫中,BeautifulSoup通常与其他库(如Requests)一起使用,用于解析和提取网页中的数据。
2.安装
要使用BeautifulSoup,首先需要安装它。可以通过pip命令直接从PyPI安装:
pip install beautifulsoup4
3.基本使用
安装完成后,我们可以开始使用BeautifulSoup来解析网页。首先,我们需要导入BeautifulSoup类,然后使用BeautifulSoup类的构造方法创建一个BeautifulSoup对象。例如:
#导入解析包
from bs4 import BeautifulSoup
html_doc = """
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
"""
#创建beautifulsoup解析对象
# html_doc 表示要解析的文档,而 html.parser 表示解析文档时所用的解析器,
# 此处的解析器也可以是 'lxml' 或者 'html5lib'
soup = BeautifulSoup(html_doc, 'html.parser')
#prettify()用于格式化输出html/xml文档
print(soup.prettify())
返回html树形结构:
<div>
<ul>
<li class="item-0">
<a href="link1.html">
first item
</a>
</li>
<li class="item-1">
<a href="link2.html">
second item
</a>
</li>
<li class="item-inactive">
<a href="link3.html">
third item
</a>
</li>
<li class="item-1">
<a href="link4.html">
fourth item
</a>
</li>
<li class="item-0">
<a href="link5.html">
fifth item
</a>
</li>
</ul>
</div>
3.1 获取第一个div标签的html代码
print(soup.div)
结果:
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</li></ul>
</div>
3.2 获取第一个li标签
print(soup.li)
结果:
<li class="item-0"><a href="link1.html">first item</a></li>
3.3 获取第一个li标签内容
使用NavigableString类中的string、text、get_text()
print(soup.li.text)
结果:
first item
3.4 返回第一个li的字典,里面是多个属性和值
print(soup.li.attrs)
结果:
{'class': ['item-0']}
3.5 查看第一个li返回的数据类型
print(type(soup.li))
结果:
<class 'bs4.element.Tag'>
3.6 根据属性,获取标签的属性值,返回值为列表 不存在就报错
print(soup.li['class'])
结果:
['item-0']
3.7 获取具体属性 获取最近的第一个属性 不存在就返回None
if soup.li:
print(soup.li.get('class'))
else:
print('title标签不存在')
结果:
['item-0']
3.8 给class属性赋值,此时属性值由列表转换为字符串
soup.li['class'] = ['abc', 'list']
print(soup.li)
结果:
<li class="abc list"><a href="link1.html">first item</a></li>
4.BS4实战
目标网站:https://movie.douban.com/chart
from bs4 import BeautifulSoup
import requests
url = 'https://movie.douban.com/chart'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}
html = requests.get(url, headers=headers)
soup = BeautifulSoup(html.text, 'html.parser')
print(soup.prettify())
4.1 查找第一个符合条件的标签
print(soup.find('a', class_='nbg'))
结果:
<a class="nbg" href="https://movie.douban.com/subject/34971728/" title="盟军敢死队">
<img alt="盟军敢死队" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2908456064.jpg" width="75"/>
</a>
4.2 查找所有符合条件的标签
for item in soup.find_all('a', class_='nbg'):
print(item)
结果:
<a class="nbg" href="https://movie.douban.com/subject/34971728/" title="盟军敢死队">
<img alt="盟军敢死队" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2908456064.jpg" width="75"/>
</a>
<a class="nbg" href="https://movie.douban.com/subject/35503073/" title="对你的想象">
<img alt="对你的想象" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905327559.jpg" width="75"/>
</a>
<a class="nbg" href="https://movie.douban.com/subject/35742980/" title="挑战者">
<img alt="挑战者" class="" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2902765793.jpg" width="75"/>
</a>
<a class="nbg" href="https://movie.douban.com/subject/35914398/" title="哥斯拉-1.0">
<img alt="哥斯拉-1.0" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2900227040.jpg" width="75"/>
</a>
<a class="nbg" href="https://movie.douban.com/subject/36467351/" title="银河写手">
<img alt="银河写手" class="" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2905680871.jpg" width="75"/>
</a>
<a class="nbg" href="https://movie.douban.com/subject/35490167/" title="破墓">
<img alt="破墓" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2905896429.jpg" width="75"/>
</a>
<a class="nbg" href="https://movie.douban.com/subject/35410336/" title="噬血芭蕾">
<img alt="噬血芭蕾" class="" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2907891933.jpg" width="75"/>
</a>
<a class="nbg" href="https://movie.douban.com/subject/35611467/" title="老狐狸">
<img alt="老狐狸" class="" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2898513142.jpg" width="75"/>
</a>
<a class="nbg" href="https://movie.douban.com/subject/30359440/" title="黄雀在后!">
<img alt="黄雀在后!" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2905336155.jpg" width="75"/>
</a>
<a class="nbg" href="https://movie.douban.com/subject/35750081/" title="美国内战">
<img alt="美国内战" class="" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2908735043.jpg" width="75"/>
</a>
4.3 使用CSS选择器查找标签
获取 class=“nbg” 的子标签第一项 img 的图片地址
print(soup.select('.nbg > img')[0]['src'])
结果:
https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2908456064.jpg
4.4 遍历所有文本内容
for string in soup.stripped_strings:
print(string)
结果:
豆瓣电影排行榜
登录/注册
下载豆瓣客户端
豆瓣
6.0
全新发布
×
豆瓣
扫码直接下载
iPhone
·
Android
豆瓣
读书
电影
音乐
同城
小组
阅读
FM
时间
......