目录
一、bs4的基本使用
(1)导入
(2)创建对象
二、节点定位
1、根据标签名查找节点
2、基本函数使用
(1)find
(2)find_all
(3)select
三、节点信息
1、获取节点内容
2、获取节点属性
附:bs4的基本使用.html
四、bs4的应用
注:Python3.10+,使用 Beautiful Soup 时出现错误“AttributeError 'collections' has no attribute 'Callable'”。
在 python 3.10+ 中,collections.Callable已移至collections.abc.Callable 。
故推荐用Python3.10以下版本。
一、bs4的基本使用
(1)导入
from bs4 import BeautifulSoup
(2)创建对象
--服务器响应的文件生成对象
soup = BeautifulSoup(response.read().decode(),'lxml')
--本地文件生成对象
#默认打开文件的编码格式是gbk,故在打开文件的时候要指定编码
soup = BeautifulSoup(open('bs4的基本使用.html',encoding='utf-8'),'lxml')
二、节点定位
1、根据标签名查找节点
#找到的是第一个符合条件的数据 print(soup.a)
#获取标签的属性和属性值 print(soup.a.attrs)
2、基本函数使用
(1)find
#找到的是第一个符合条件的数据 print(soup.find('a')) #和soup.a差不多
#根据title的值来找到对应的标签对象 print(soup.find('a',title = "A1"))
#根据class的值来找到对应的标签对象 #注意class需要添加下划线 print(soup.find('a',class_ = "A2"))
(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')) #和find差不多#类选择器 #可以通过.代表class print(soup.select('.A2'))#可以通过#代表id print(soup.select('#L1'))#属性选择器 #查找li标签中有id的标签 print(soup.select('li[id]'))#查找到li标签中id为L1的标签 print(soup.select('li[id="L1"]'))# 层级选择器 #后代选择器 查找div下面的li 返回的是一个列表 print(soup.select('div li'))#子代选择器 #某标签的第一级子标签 # warning:在大多数编程语言中需要div > ul >li 这样写,但是在bs4中,可以写div>ul>li。 print(soup.select('div>ul>li'))# 获取多个标签的数据 print(soup.select('a,span')) #区别 同find_all 一样输出 print(soup.find_all(['a','span']))
三、节点信息
1、获取节点内容
obj = soup.select('#d1')[0] #如果标签对象中,只有内容那么string和get_text()都可以使用 #如果标签对象中,除了内容还有标签,那么string就会输出NONE print(obj.string) print(obj.get_text())
2、获取节点属性
obj = soup.select('#p1')[0] #name是标签的名字 print(obj.name) #将属性值作为一个字典返回 print(obj.attrs)#获取节点的属性 obj = soup.select('#p1')[0] print(obj.attrs.get('class')) print(obj.get('class')) print(obj['class'])
附:bs4的基本使用.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="" id="" class="A2">蜀道之南718</a><span>万事如意</span></ul></div><a href="" title="A1">百度</a><div id="d1"><span>恭贺新禧</span></div><p id="p1" class="p1">大吉大利</p>
</body>
</html>
四、bs4的应用
用bs4来爬取麦当当的所有汉堡品类
import urllib.requesturl = "https://www.mcdonalds.com.cn/index/Food/menu/burger"response = urllib.request.urlopen(url)content = response.read().decode('utf-8')from bs4 import BeautifulSoupsoup = BeautifulSoup(content,'lxml')#//span[@class="name"]/text()
name_list = soup.select('.name')for name in name_list:print(name.get_text())