爬虫_解析_BeautifulSoup
1.基本简介
BeautifulSoup简称:bs4
BeautifulSoup,和lxml一样,是一个html的解析器,主要功能也是解析和提取数据
优缺点:效率没有lxml的效率高,接口设计人性化,使用方便
2.安装以及创建
2.1安装
pip install bs4
2.2导入
from bs4 import BeautifulSoup
2.3创建对象
2.3.1 服务器响应的文件生成对象
soup= BeautifulSoup(response.read().decode(),'lxml')
2.3.2 本地文件生成对象
soup = BeautifulSoup(open('1.html'),'lxml')
注意:默认打开文件的编码格式gbk所以需要制定打开编码格式
3.案例
3.1 解析本地文件
1.html内容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <ul> <li id="l1">张三</li> <li id="l2">李四</li> <li>王五</li> <a href="" class="a1">创客未来</a> <span>嘿嘿嘿</span> </ul> </div> <a href="" title="a2">百度</a> <div id="d1"> <span> 哈哈 </span> </div> <p id="p1" class="p1">呵呵呵</p> </body> </html>
具体代码如下:
from bs4 import BeautifulSoup #加载本地文件 #默认打开的文件的编码格式为gbk,所以在打开文件的时候需要指定编码格式encoding='utf-8' soup = BeautifulSoup(open('1.html',encoding='utf-8'),'lxml') #根据标签名查找节点 #找到的是第一个符合条件的数据 # print(soup.a) #获取标签的属性和属性值 # print(soup.a.attrs) #bs4的一些函数 #(1)find #返回的是第一个符合条件的数据 #print(soup.find('a')) #根据title的值来到到对应的标签对象 # print(soup.find('a',title='a2')) #根据class的值来找到对应的标签对象,注意的是class需要添加下划线 # print(soup.find('a',class_="a1")) #(2)find_all #返回的是一个列表并且返回了所有的a标签 # print(soup.find_all('a')) #如果想要获取的是多个标签的数据那么需要在find_all的参数中添加的是列表的数据 # print(soup.find_all(['a','span'])) #limit的作用是查找前几个数据 #print(soup.find_all('li',limit=2)) #(3)select(推荐) #select 方法返回的是一个列表,并且会返回多个数据 # print(soup.select('a')) # 可以通过.代表class 我们把这种操作叫做类选择器 # print(soup.select('.a1')) #查找id为l1的标签 # print(soup.select('#l1')) #属性选择器--通过属性来寻找对应的标签 #查找到li标签中有id的标签 # print(soup.select('li[id]')) #查找到li标签中id为l2的标签 # print(soup.select('li[id="l2"]')) #层级选择器 # 后代选择器 #找到是div下面的li # print(soup.select('div li')) #子代选择器 #某标签的第一级子标签 # print(soup.select('div > ul > li')) #注意:很多的计算机编程语音中,如果不加空格不会输出内容,但是在bs4中不会报错,会显示内容 # print(soup.select('div>ul>li')) #找到a标签和li标签的所有对象 # print(soup.select('a,li')) #节点信息 # 获取节点内容 # obj = soup.select('#d1')[0] #如果标签对象中只有内容那么string和get_text()都可以使用 #如果标签对象中除了内容还有标签那么string就获取不到数据,而get_text()是可以获取数据 #我们一般情况下 推荐使用get_text() # print(obj.string) # print(obj.get_text()) # 节点的属性 # obj = soup.select('#p1')[0] # print(obj.name) #将属性值作为一个字典返回 # print(obj.attrs) #获取节点的属性 obj = soup.select('#p1')[0] print(obj.attrs.get('class')) print(obj.get('class')) print(obj['class'])
3.2 解析服务器文件
#需求:爬取星巴克产品目录 import urllib.request url = 'https://www.starbucks.com.cn/menu/' response = urllib.request.urlopen(url) content = response.read().decode('utf-8') from bs4 import BeautifulSoup soup = BeautifulSoup(content,'lxml') # //ul[@class="grid padded-3 product"]//strong/text() name_list = soup.select('ul[class="grid padded-3 product"] strong') for name in name_list: print(name.string)
代码地址:https://gitee.com/heating-cloud/python_spider.git
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!