目录
beautifulSoup简称——bs4
简介
Beautiful Soup是一个Python库,用于网络爬虫,用于从HTML和XML文件中提取数据。它提供了一种浏览、搜索和修改HTML或XML文档解析树的方式。Beautiful Soup通过提供一种Pythonic的方式与HTML或XML内容进行交互,使得从网页中抓取信息变得容易。它可以处理错误的标记,并可以将输入的文档转换为Unicode,输出的文档转换为UTF-8。
简而言之就是beautifulsoup和lxml一样都是一个html的解析器,主要功能也是解析和提取数据。
优缺点
缺点:效率没有lxml的效率高
优点:接口设计人性化,使用比较方便
安装以及创建
1.安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ bs4
2.导入
from bs4 import BeautifulSoup
3.创建对象
服务器响应的文件生成对象
soup = BeautifuleSoup(response.read().decode(), 'lxml')
本地文件生成对象
soup = BeautifulSoup(open('1.html'), 'lxml')
注意:默认打开文件的编码格式是GBK,所以需要指定打开编码格式
基础语法
直接看下面的代码, 有非常详细的注释,
我们的html文件内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<ul>
<li id="zs">张三</li>
<li>李四</li>
<li id="">王五</li>
<a href="" id="wj" class="go">WenJGo</a>
<span class="hh">^_^哈哈哈</span>
</ul>
</div>
<a href="" title="aa">baidu</a>
</body>
</html>
python代码如下,这里面有详细的使用方法以及注释
from bs4 import BeautifulSoup
# 通过解析本地文件 来bs4基础语法进行讲解
# 默认打开问价你的编码格式是GBK,所以在打开文件的时候需要指定编码
soup = BeautifulSoup(open('22_解析_BeautifulSoup的基本使用.html', encoding='utf-8'), 'lxml')
# 根据标签名称查找节点
# 找到的是第一个符合条件的数据
print(soup.a)
# 获取标签的属性以及属性值
print(soup.a.attrs)
print('-----------------')
# bs4的一些函数
# (1)find
# 返回的是第一个符合条件的数据
print(soup.find('a'))
# 根据title的值找到对应的标签对象
print(soup.find('a', title='aa'))
# 根据class的值来找到对应的标签的对象,注意:class需要天极爱下划线
print(soup.find('a', class_='wjgo'))
print('-----------------')
# (2)find_all
# 返回的是一个列表,里面存储了所有的a标签
print(soup.find_all('a'))
# 如果想获取多个标签的数据,那抹需要在find_all的参数中添加的是列表的数据
print(soup.find_all(['a', 'span']))
# 获取前两个li,,limit的作用是查找前几个数据
print(soup.find_all('li', limit=2))
print('-----------------')
# (3)select
# select方法返回的是一个列表,并且会返回多个(全部)的数据
print(soup.select('a'))
# class就在前面加一个 '.' ,也就是可以通过'.'代表class,也就是类选择器
print(soup.select('.hh'))
# id就在前面加一个 '#' ,也就是可以通过'#'代表id,也就是id选择器
print(soup.select('#zs'))
# 属性选择器-------通过属性寻找对应的标签
# 查找li标签中右id的标签
print(soup.select('li[id]'))
# li标签中查找 id = zs 的标签
print(soup.select('li[id="zs"]'))
# 层级选择器--------
# 后代选择器
# 寻找div下面的li,' '这个空格代表后代
print(soup.select('div li'))
# 子代选择器,某标签的第一级字标签
# 由于div的儿子没有li,所以这个是空
print(soup.select('div > li'))
# 这样子写就好了
# 注意:很多的计算机语言这里,如果不加空格这里不会输出内容,但是bs4没事
print(soup.select('div > ul > li'))
# 找到a标签和li标签的所有的对象
print(soup.select('a,li'))
print('-----------------')
# 节点信息
# 获取节点内容
obj = soup.select('#d1')[0]
# 如果标签对象中,只有内容,那么string和get_text()都可以用
# 但是如果标签对象中除了内容还有标签,那抹string就获取不到数据,而get_text()可以获取数据
# 所以一般使用get_text()
print(obj.string)
print(obj.get_text())
# 节点的属性
obj = soup.select('#d2')[0]
# name:标签的名字
print(obj.name)
# 将属性值作为一个字典返回
print(obj.attrs)
# 获取节点的属性
obj = soup.select('#d2')[0]
# 获取某个属性的数据
print(obj.attrs.get('class'))
# 这个方式也行
print(obj.get('class'))
# 这个方式也行
print(obj['class'])
案例:使用bs4爬取茶百道官网新品图片以及对应名称
这里我发现茶百道一点反扒都没有,所以我虽然写了UA,但是还是没有加进去
import urllib.request
from bs4 import BeautifulSoup
url = 'https://www.chabaidao.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
}
response = urllib.request.urlopen(url=url)
content = response.read().decode('utf-8')
# 寻找洛神山楂莓
soup = BeautifulSoup(content, 'lxml')
# xpath : //div//ul[@class="container"]//h4/text()
name_list = soup.select('.container h4')
img_list = soup.select('.container img[src]')
# 保存到本地
for i in range(len(img_list)):
name = name_list[i].string
img = img_list[i].attrs.get('src')
url = 'https://www.chabaidao.com' + img
urllib.request.urlretrieve(url=url, filename='./爬取茶百道新品名称以及照片/' + name + '.jpg')
总结
多多练习,但是我只能说还是xpath好用,因为浏览器有xpath这个插件,你可以知道你是不是找对地方了嘿嘿,ヾ( ̄▽ ̄)Bye~Bye~