1、概念

  • BeautifulSoup最主要的功能解析从网页抓取的数据,即通过其解析后,可使用第一章所讲的Selector进行HTML标签查找。
  • BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则Python会使用默认的解析器。
  • lxml 解析器更加强大,速度更快,推荐使用lxml 解析器。

2、安装

  • 由于第二章已经介绍过具体安装步骤,这里只给出执行语句:
pip install beautifulsoup4
pip install lxml
  • 其中lxml为HTML解析器,届时作为“参数”传入BeautifulSoup。

3、分析

  • 以第二章的豆瓣Top250电影网站爬虫为例:
    豆瓣Top250电影爬虫

  • 在第二章中,我们成功使用Requests库获取到了网站源代码信息,但并没有得到我们想要的具体的数据(如获取电影名称),要获取电影名称,就必须解析图中的web_data.text,因为此时web_data.text为字符串类型,我们无法对字符串进行查找。

  • BeautifulSoup进行查找需要用到标签的Selector路径,打开豆瓣Top250电影网站,以第一部电影《肖申克的救赎》为例,按F12打开检查面板,在面板最左上方有一个箭头指向正方形的图标,点击即可选择网页标签(也可在打开检查面板前,按Ctrl + Shift + C直接进入选择标签模式,同时自动打开检查面板)。鼠标移动到电影名称上,会出现此标签的信息。
    选择标签

  • 点击此标签(电影名称),控制面板会出现此标签的源代码,可以看到电影名位于<span></span>标签内。鼠标点击选择此标签,右键 - Copy - Copy Selector,即可将此标签Selector路径复制下来。
    复制Selector

  • 获取到Selector路径后,即可使用BeautifulSoup的select()方法,传入Selector路径,从而获取此标签,再通过.text获取标签内(即<span>与</span>之间)的文本内容,即获取到我们想要的电影名。

4、代码

  • 首先导入BeautifulSoup包。
from bs4 import BeautifulSoup
  • 定义soup变量,保存BeautifulSoup解析后的值,并打印查看结果。
soup = BeautifulSoup(web_data.text, 'lxml')
print(soup)

soup结果

  • 此时可能并不能看出使用BeautifulSoup解析前后的不同,但其实soup已经不是解析前的字符串类型了,我们可以对其进行标签查找。
  • 使用select()方法获取电影名并打印结果,其中select传入的参数为复制的Selector路径:
movie_name = soup.select('#content > div > div.article > ol > li:nth-child(1) > div > div.info > div.hd > a > span:nth-child(1)')
print(movie_name)

结果

  • 需注意,select()返回的是一个列表,因为有时候可能要查找多个标签,故在使用.text取出电影名之前,需要先从列表取出标签,即为上图中的[0],这时方可使用.text作用于解析后的标签。
  • 当然,我们也可以获取此网页所有的电影名。对比第二部电影《霸王别姬》的Selector路径:
Xiao = '#content > div > div.article > ol > li:nth-child(1) > div > div.info > div.hd > a > span:nth-child(1)'
Wang = '#content > div > div.article > ol > li:nth-child(2) > div > div.info > div.hd > a > span:nth-child(1)'
  • 可发现唯一的不同即为“ li:nth-child(n) ”,第一部电影n为1,第二部电影n为2,故若去掉“ :nth-child(n) ”,则可以获取所有的电影名(此处涉及到HTML知识):
movie_name = soup.select('#content > div > div.article > ol > li > div > div.info > div.hd > a > span:nth-child(1)')
print(movie_name)

获取所有电影名

  • 结果即为包含所有电影名标签的列表。
  • 完整代码如下:
import requests
from bs4 import BeautifulSoup

Headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
}

Url = 'https://movie.douban.com/top250'

web_data = requests.get(Url, headers=Headers)

soup = BeautifulSoup(web_data.text, 'lxml')
# print(soup)

movie_name = soup.select('#content > div > div.article > ol > li > div > div.info > div.hd > a > span:nth-child(1)')

print(movie_name)
# print(movie_name[0].text)

# print(web_data)
# print(web_data.text)

5、总结

  • BeautifulSoup是爬虫网页解析最为常用的库之一,其操作简单,非常适合新手使用,但仍有一些细节需要注意,如.text方法作用的对象、select()返回的是一个列表等等。
  • 学如逆水行舟,不进则退!
  • (ง •̀-•́)ง
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐