python爬虫-数据解析BeautifulSoup

1、基本简介

BeautifulSoup简称bs4,BeautifulSoup和lxml一样是一个html的解析器,主要功能也是解析和提取数据。

BeautifulSoup和lxml类似,既可以解析本地文件也可以响应服务器文件。

缺点:效率没有lxml的效率高 。

优点:接口设计人性化,使用方便。

2、安装

bash 复制代码
pip install bs4

3、基本语法

一、 节点定位

  1. 根据标签名查找节点

soup.a 【注】只能找到第一个 a

soup.a.name

soup.a.attrs

  1. 函数

(1).find(返回一个对象 )

find('a'):只找到第一个a 标签

find('a', title='名字')

find('a', class_='名字')

(2).find_all(返回一个列表 )

find_all('a') 查找到所有的a

find_all('a', 'span') 返回所有的a 和 span

find_all('a', limit=2) 只找前两个a

(3).select(根据选择器得到节点对象 ) 【推荐】

1.element

eg:p

2..class

eg:.firstname

3.#id

eg:#firstname

4.属性选择器

attribute

eg:li = soup.select('liclass')

attribute=value

eg:li = soup.select('liclass="hengheng1"')

5.层级选择器

element element

div p

element>element

div>p

element,element

div,p

eg:soup = soup.select('a,span')

二、节点信息

(1). 获取节点内容:适用于标签中嵌套标签的结构

obj.string

obj.get_text()【推荐】

(2). 节点的属性

tag.name 获取标签名

eg:tag = find('li)

print(tag.name)

tag.attrs将属性值作为一个字典返回

(3). 获取节点属性

obj.attrs.get('title')【常用】

obj.get('title')

obj'title'

python代码:

python 复制代码
from bs4 import BeautifulSoup
 
# 通过解析本地文件 对bs4基础语法进行熟悉
# 默认打开的编码格式是gbk 所以在打开文件的时候需要指定编码
soup = BeautifulSoup(open('6.html',encoding='utf-8'),'lxml')
 
# 根据标签名查找节点
# 注意找到的是第一个符合条件的信息
print(soup.a)
# attrs 获取标签的属性和属性值
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(推荐)        返回的是一个列表,并且返回多个数据
print(soup.select('a'))
# 可以通过 . 代表class    我们把这种操作叫做类选择器
print(soup.select('.a1'))
# 可以通过 # 代表id
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'))
 
#   子代选择器
# 某标签的第一级子标签
# 注意:很多的计算机编程语言中不加空格就不会输出内容,但是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]
# name是标签的名字
print(obj.name)
# 将属性值作为一个字典返回
print(obj.attrs)
 
# 获取节点的属性
obj = soup.select('#p1')[0]
print(obj.attrs.get('class'))
print(obj.get('class'))
print(obj['class'])

4、案例:星巴克

需求:爬取星巴克官网中的产品名称。

网页中找到星巴克的接口

python代码:

python 复制代码
import urllib.request
from bs4 import BeautifulSoup
 
url = 'https://www.starbucks.com.cn/menu/'
 
response = urllib.request.urlopen(url)
 
content = response.read().decode('utf-8')
 
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.get_text())
相关推荐
顾林海2 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱5 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
Caco_D8 小时前
一行代码抓遍全网 20 个热榜!Aneiang.Pa 4.0 发布 — 极简 .NET 爬虫库
爬虫·.net
曲幽9 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码10 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱19 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵21 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio1 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户0332126663671 天前
使用 Python 从零创建 Word 文档
python
Csvn1 天前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python