通过前面学习,requests库帮我们搞定了爬虫第0步—获取数据;HTML知识能够辅助我们解析和提取数据。接下来,解析和提取数据的部分要交给灵活又方便的网页解析库——BeautifulSoup。本节课学习的目标是:学会使用BeautifulSoup解析和提取网页中的数据。
01
使用BeautifulSoup解析数据
我们平时使用浏览器上网,浏览器会把服务器返回来的HTML源代码翻译成我们能看懂的样子,之后我们才能做各种操作,这种翻译操作其实就是“解析数据”。同理,在爬虫中,也要使用能读懂html的工具,这样才能提取到想要的数据。
bs对象=BeautifulSoup(要解析的文本,'解析器')
括号中的第2个参数用来标识解析器,要们要用的是一个Python内置库:html.parser。(它不是唯一的解析器,却是最简单的那个)。
import requests
#引入BS库,下面的bs4就是beautifulsoup4
from bs4 import BeautifulSoup
res=requests.get('某网页')
soup=BeautifulSoup(res.text,'html.parser')
print(type(soup))
print(soup)
查看运行结果,soup的数据类型是<class 'bs4.BeautifulSoup'>,而下一行开始,打印的就是我们所请求网页的完整HTML源代码,我们所要的数据都在里面。
虽然response.text和soup打印出的内容表面上看长得一模一样,但它们属于不同的类:<class 'str'>和<class 'bs4.BeautifulSoup'>,如果这不是一个BeautifulSoup对象,我们是没法调取相关的属性和方法的。
02
使用BeautifulSoup提取数据
提取数据就是把我们需要的数据从众多数据中挑选出来。
一、find()和find_all()
find()和find_all()是BeautifulSoup对象的两个方法,它们可以匹配html的标签和属性,把BeautifulSoup对象里符合要求的数据都提取出来。其中find()只提取首个满足要求的数据,而find_all()提取出的是所有满足要求的数据。用法:BeautifulSoup对象.find(标签,属性)
:soup.find('div',class_='books')
1.这里的class_带一个下划线,是为了和python语法中的类class区分,避免程序区分。(除了class属性还可以使用style属性等)
2.括号中的参数:标签和属性可以任选其一,也可以两个一起使用,这取决于我们要提取的内容。如果只用其中一个参数可以准确定位的话,就只用一个参数检索;如果需要标签和属性同时满足的情况下才能准确定位到我们想找到的内容,就两个参数一起使用。
二、Tag对象
items=soup.find_all(class_='books')
for item in items:
print(item)
print(type(item))
继续上文中的代码
我们可以看到它们的数据类型是<class 'bs4.element.Tag'>,是Tag对象。
首先,Tag对象可以使用find()和find_all()继续检索。即Tag.find()和Tag.find_all()。其次,使用Tag.text可以提取Tag中的文字。最后,使用Tag<'属性名'>可以提取Tag中这个属性的值。