BeautifulSoup的使用
用法:
BeautifulSoup库(也称bs4库)BeautifulSoup解析html/xml文件
from bs64 import BeautifulSoup
BeautifulSoup(html代码,''html.parser')
BeautifulSoup解析器有:'html.parser','lxml'等
BeautifulSoup类的基本元素:
1.Tag标签 <>和</>标注开头结尾 Tag的两个重要属性name和attrs
2.Name <p>...</p>的名字是'p', 格式tag.name 输出的值为标签本身的名称
3.Attributes 格式tag.attrs 得到的类型是一个字典
4.NavigableString 标签内非属性字符串 <>...</>中字符串 格式: tag.string
5.Comment 首先类型,是否为 Comment 类型,然后再进行其他操作
BeautifulSoup提供了find_all(name,attrs(要用字典形式展现出来),text,)方法 返回一个列表类型
BeautifulSoup也支持css来搜索,不过要用"class_="这样的形式,因为class在python中是一个保留关键字
实例:解析本地HTML文件
from bs4 import BeautifulSoup
soup=BeautifulSoup(open('test.html',encoding='utf-8',),'lxml')
-
根据标签名查找节点
print(soup.a) #得到的是第一个符合条件的数据
-
获取标签的属性和属性值
print(soup.a.attrs) #是基于第一个符合条件的数据上获取属性(/值) 以列表形式返回
bs4的一些函数
-
find
print(soup.find('a')) print(soup.find('a',title='a2')) # 根据title的值来找到对应的标签对象 print(soup.find('a',class_='a1')) # 根据class的值来找到对应的标签对象,写成class_才不会报错
-
find_all 返回的是一个列表
print(soup.find_all('a')) #返回了所有的a标签 print(soup.find_all(['a','span'])) #如果想获取多个标签里的数据,那么需要在find_all的参数里传入列表 print(soup.find_all('li',limit=2)) # limit的作用是查找前几个数据
-
select 返回的是一个列表
print(soup.select('a')) print(soup.select('a,li')) #找到a标签和li标签的所有对象 print(soup.select('.a1')) #class='a1'的节点数据 print(soup.select('#l1')) #id='a1'的节点数据
-
属性选择器*------>*通过属性来寻找对应的标签
print(soup.select('li[id]')) # 查找到li标签中有id的标签 print(soup.select('li[id="l2"]')) # 查找到li标签中id为l2的标签
-
后代选择器
print(soup.select('div li')) # 找到div下面的li
-
子代选择器
print(soup.select('div > ul > li'))
-
节点信息
-
获取节点信息的内容 一般情况下,推荐使用get_text()
- 如果标签对象中 只有内容,那么string和get_text()都可以使用
- 如果标签对象中 除了内容还有标签 那么string就获取不到数据 而get_text()是可以获取到数据的
obj=soup.select('#d1')[0] print(obj.string) print(obj.get_text())
-
节点的属性
obj=soup.select('#p1')[0] print(obj.name) # name是标签的名字 print(obj.attrs) # 将属性值作为字典返回 print(obj.attrs.get('class')) #获取属性里的某一具体值
实例:豆瓣电影的获取
import requests
from bs4 import BeautifulSoup
url='https://movie.douban.com/cinema/nowplaying/xian/'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67'
}
response=requests.get(url,headers=headers)
html=response.text
soup=BeautifulSoup(html,'html.parser')
# print(soup.prettify())
#获取电影的id、data-title、data-score、data-director、data-actors
movie_list=soup.find_all('li',attrs={"class":"list-item"})#或写成class_="list-item"
# print(len(movie_list)) #47
movie_infos=[]
for item in movie_list:
infos = {}
infos['id']=item['id']
infos['data-title']=item['data-title']
# infos['data-score']=item['data-score']
infos['data-director']=item['data-director']
infos['data-actors']=item['data-actors']
movie_infos.append(infos)
with open('movies.txt','w',encoding='utf-8') as fp:
for item in movie_infos:
fp.write(str(item)+'\n')
实例:爬取星巴克饮品名称
import requests
from bs4 import BeautifulSoup
url='https://www.starbucks.com.cn/menu/'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183'
}
response=requests.get(url,headers=headers).text
# <strong>阿馥奇朵™</strong>
soup=BeautifulSoup(response,'html.parser')
# soup.select('ul[class="grid padded-3 product"] li')
datas=soup.select('ul[class="grid padded-3 product"] strong')
for data in datas:
print(data.get_text())