一.BeautifulSoup 解析网页中的数据
1.用法
bs对象=BeautifulSoup(要解析的文本,‘解析器’)
注意:要解析的文本,必须是字符串
解析器:我们要用的是一个Python内置库:html.parser。(它不是唯一的解析器,但是比较简单的)
import requests
from bs4 import BeautifulSoup
res = requests.get('URL')
soup = BeautifulSoup( res.text,'html.parser')
print(type(soup)) #查看soup的类型
print(soup) # 打印soup
看看运行结果,soup的数据类型是<class ‘bs4.BeautifulSoup’>,说明soup是一个BeautifulSoup对象。
二.提取数据
1.find与find_all()
方法 | 作用 | 用法 | 示例 |
---|---|---|---|
find() | 提取满足要求的首个数据 | BeautifulSoup对象.find(标签,属性) | soup.find(‘div’,class_=‘books’) |
find_all() | 提取满足要求的所有数据 | BeautifulSoup对象.find_all(标签,属性) | soup.find_all(‘div’,class_=‘books’) |
注意:class_,这里有一个下划线,是为了和python语法中的类 class区分,避免程序冲突。当然,除了用class属性去匹配,还可以使用其它属性,比如style属性等。
使用了find(),find_all()后,我们打印出来的东西还不是目标数据,里面含着HTML标签,所以下面,我们要进入到提取数据中的另一个知识点——Tag对象。
2.Tag
属性/方法 | 作用 |
---|---|
Tag.find()和Tag.find_all() | 提取Tag中的Tag |
Tag.text | 提取Tag中的文字 |
Tag[‘属性名’] | 输入参数:属性名,可以提取Tag中这个属性的值 |
例子:
https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html
现在我们想提取三本书的信息:
import requests
from bs4 import BeautifulSoup
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')# 返回一个Response对象,赋值给res
html= res.text# 把Response对象的内容以字符串的形式返回
soup = BeautifulSoup( html,'html.parser') # 把网页解析为BeautifulSoup对象
items = soup.find_all(class_='books') # 通过定位标签和属性提取我们想要的数据
for item in items:
print('想找的数据都包含在这里了:\n',item) # 打印item
运行结果:
可见:我们提取出的数据包含HTML标签,所以需要进一步提取
,会用到Tag。
接下来,我们分别提取出每本书的h2、title和info标签的内容。
kind = item.find('h2') # 在列表中的每个元素里,匹配标签<h2>提取出数据
title = item.find(class_='title') #在列表中的每个元素里,匹配属性class_='title'提取出数据
brief = item.find(class_='info') #在列表中的每个元素里,匹配属性class_='info'提取出数据
现在,kind、title和brief都是Tag对象,我们需要提取Tag对象中的内容,我们用Tag.text提出Tag对象中的文字,用Tag[‘href’]提取出URL。
import requests
from bs4 import BeautifulSoup
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
html = res.text
soup = BeautifulSoup( html,'html.parser')
items = soup.find_all(class_='books')
for item in items: # 遍历列表items
kind = item.find('h2') # 在列表中的每个元素里,匹配标签<h2>提取出数据
title = item.find(class_='title') # 在列表中的每个元素里,匹配属性class_='title'提取出数据
brief = item.find(class_='info') # 在列表中的每个元素里,匹配属性class_='info'提取出数据
print(kind.text,'\n',title.text,'\n',title['href'],'\n',brief.text) # 打印书籍的类型、名字、链接和简介的文字
现在就提取出了所有不带HTML标签的信息。