当前位置: 首页 > news >正文

基于python对网页进行爬虫简单教程

python对网页进行爬虫

基于BeautifulSoup的爬虫—源码
"""
基于BeautifulSoup的爬虫###?一、BeautifulSoup简介1.?Beautiful?Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
2.?Beautiful?Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful
3.?Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
4.?Beautiful?Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
5.?BS基于DOM结构进行页面内容解析,当开始解析时,会将整个页面的DOM树保存于内存中,进而实现查找。
解析器:
1.?Python标准库?BeautifulSoup(markup,?"html.parser")?-?Python的内置标准库,执行速度适中,文档容错能力强
2.?lxml?HTML解析器?BeautifulSoup(markup,?"lxml")?-?速度快,文档容错能力强,需要安装C语言库
3.?lxml?XML解析器?BeautifulSoup(markup,?"xml")?-?速度快,唯一支持XML的解析器,需要安装C语言库
4.?html5lib?BeautifulSoup(markup,?"html5lib")?-?最好的容错性,以浏览器的方式解析文档,生成HTML5格式的文档,速度慢,不依赖外部扩展###?二、具体代码使用
"""
from?bs4?import?BeautifulSoup
import?requestsresp?=?requests.get('https://www.cnblogs.com/leyinsec')#?初始化解析器
html?=?BeautifulSoup(resp.text,?'lxml')#?查找页面元素,根据标签层次进行查找
#?print(html.head.title)
#?print(html.head.title.string)
#?print(html.div)
#?print(html.div.div)
#?查找页面元素的通用方法,find_all,select#?查找页面所有超链接
def?html_href():
????links?=?html.find_all('a')
????for?link?in?links:
????????try:
????????????print(link['href'])
????????except?KeyError:
????????????print("No?href?attribute?found?for?this?tag")#?查找页面图片
def?html_images():
????images?=?html.find_all('img')
????for?image?in?images:
????????print(image['src'])"""
#?根据id或calss等属性查找
keyword?=?html.find_all(id='keyword')
print(keyword)
print(keyword['placeholder'])#?根据title查找
titles?=?html.find_all(class_='title')
for?title?in?titles:
????print(title)
????print(title.find('a'))#?根据text查找
title?=?html.find(text='leyinsec')
print(title.parent)#?根据xpath的风格进行查找?//[@class='title'?and/or?@id=1]
titles?=?html.find_all('div',?{'class':?'title'})
for?title?in?titles:
????print(title)
????
#?css选择器
titles?=?html.select('div.title')
for?title?in?titles:
????print(title)
????
#?css选择器查找id
keyword?=?html.select('#keyword')
try:
????print(keyword['placeholder'])
except?TypeError:
????print("No?keyword?attribute?found?for?this?tag")#?列表查找
lis?=?html.select('ul?li')
print(lis)
"""if?__name__?==?'__main__':
????html_images()
基于BeautifulSoup的爬虫—源码解析

这段代码是一个基于BeautifulSoup库的简单爬虫示例,用于从指定的网页中提取超链接和图片链接。下面是对代码的详细分析:

导入库
from?bs4?import?BeautifulSoup
import?requests

这两行代码导入了编写爬虫所需的两个库:BeautifulSoup用于解析HTML文档,requests用于发送HTTP请求。

发送HTTP请求
resp?=?requests.get('https://www.cnblogs.com/leyinsec')

这行代码使用requests库向指定的URL发送GET请求,并将响应存储在变量resp中。

解析HTML文档
html?=?BeautifulSoup(resp.text,?'lxml')

这行代码使用BeautifulSoup解析HTTP响应中的文本内容。这里使用了’lxml’作为解析器,因为它通常比Python内置的解析器更快且具有更好的容错性。

定义查找页面元素的函数
查找所有超链接
def?html_href():
????links?=?html.find_all('a')
????for?link?in?links:
????????try:
????????????print(link['href'])
????????except?KeyError:
????????????print("No?href?attribute?found?for?this?tag")

这个函数查找HTML文档中所有的<a>标签,并尝试打印出每个链接的href属性。如果某个<a>标签没有href属性,则会捕获KeyError异常并打印一条消息。

查找所有图片
def?html_images():
????images?=?html.find_all('img')
????for?image?in?images:
????????print(image['src'])

这个函数查找HTML文档中所有的<img>标签,并打印出每个图片的src属性。

根据属性查找元素
keyword?=?html.find_all(id='keyword')
print(keyword)
print(keyword['placeholder'])

这段代码尝试查找具有特定id属性的元素,并打印出该元素及其placeholder属性。但是这里有一个错误:keyword是一个列表,所以不能直接使用keyword['placeholder']。应该遍历列表并分别访问每个元素的属性。

根据类名查找元素
titles?=?html.find_all(class_='title')
for?title?in?titles:
????print(title)
????print(title.find('a'))

这段代码查找所有具有title类的元素,并打印出这些元素及其内部包含的<a>标签。

根据文本查找元素
title?=?html.find(text='leyinsec')
print(title.parent)

这段代码查找文本内容为leyinsec的元素,并打印出该元素的父元素。

使用CSS选择器查找元素
titles?=?html.select('div.title')
for?title?in?titles:
????print(title)

这段代码使用CSS选择器语法查找所有具有title类的<div>元素,并打印它们。

查找具有特定ID的元素
keyword?=?html.select('#keyword')
try:
????print(keyword['placeholder'])
except?TypeError:
????print("No?keyword?attribute?found?for?this?tag")

这段代码试图查找具有特定ID的元素,并打印其placeholder属性。但是这里同样有一个错误:keyword是一个列表,所以不能直接使用keyword['placeholder']。应该遍历列表并分别访问每个元素的属性。

列表查找
lis?=?html.select('ul?li')
print(lis)

这段代码查找所有在<ul>标签内的<li>元素,并打印出这个列表。

主函数调用
if?__name__?==?'__main__':
????html_images()

这段代码确保当脚本作为主程序运行时,调用html_images()函数来执行图片链接的查找和打印。

总结

这段代码展示了如何使用BeautifulSoup库来解析HTML文档,并通过不同的方法查找和提取页面元素。需要注意的是,代码中有一些错误需要修正,特别是在处理查找结果为列表的情况时。此外,代码中没有处理网络请求可能出现的异常,例如连接错误或HTTP错误状态码。在实际应用中,应该添加适当的异常处理来提高代码的健壮性。

基于正则表达式的爬虫—源码
"""
基于正则表达式的爬虫以下是提取的文章内容:###?一、爬虫简介1.?**搜索引擎**:百度,谷歌,企业内部的知识库,某些项目专项数据爬取,专业的数据爬取。
2.?**互联网**:
???-?公网(不需要授权的情况就可以浏览的内容,搜索引擎的重点)
???-?深网(需要授权才能使用的内容)
???-?暗网(非正式渠道,无法使用常规手段访问)
3.?**爬取互联网的公开信息**,但是正常情况下,也需要遵守一个规则:robots协议:[https://www.baidu.com/robots.txt](https://www.baidu.com/robots.txt)(君子协议)###?二、基本原理1.?**所有和网页,均是HTML**:
???-?HTML首先是一个大的字符串,可以按照字符串处理的方式对响应进行解析处理。
???-?其次,HTML本身也是一门标记语言,与XML是同宗同源,所以可以使用DOM对其文本进行处理。
2.?**所有的爬虫,核心基于超链接**,进而实现网站和网页的跳转。给我一个网站,爬遍全世界。
3.?**如果要实现一个整站爬取**,首先要收集到站内所有网址,并且将重复网址去重,开始爬取内容并保存在本地数据库,进行实现后续目标。
###?三、正则表达式实现
"""
import?re
import?timeimport?requestsdef?download_page():
????resp?=?requests.get('https://www.cnblogs.com/leyinsec')
????#?解析网页所有超链接
????links?=?re.findall('<a?href="(.+?)"',?resp.text)
????for?link?in?links:
????????#?排除无用链接
????????if?'postid'?in?link?or?'archive'?in?link:
????????????continue
????????elif?link.startswith('javascript'):
????????????continue
????????#?将页面文件保存在本地
????????resp?=?requests.get(link)
????????resp.encoding?=?'utf-8'
????????filename?=?link.split('/')[-1]?+?time.strftime("_%Y%m%d_%H%M%S")?+?'.html'
????????with?open(f'page/leyinsec博客园/{filename}',?'w',?encoding='utf-8')?as?file:
????????????file.write(resp.text)def?download_images():
????resp?=?requests.get('https://www.cnblogs.com/leyinsec')
????images?=?re.findall('<img?src="(.+?)"',?resp.text)
????for?image?in?images:
????????if?image.startswith('/'):
????????????image?=?'https://www.cnblogs.com/leyinsec'?+?image
????#?下载图片
????????resp?=?requests.get(image)
????????filename?=?time.strftime("_%Y%m%d_%H%M%S")?+?image.split('/')[-1]
????????with?open('page/leyinsec博客园/photos/'?+?filename,?'wb')?as?file:
????????????file.write(resp.content)if?__name__?==?'__main__':
????download_page()
????download_images()
基于正则表达式的爬虫—源码解析

这段代码是一个简单的基于正则表达式的爬虫,用于从指定的网页中提取超链接和图片链接,并将它们保存到本地文件系统中。下面是对代码的详细分析:

导入库
import?re
import?time
import?requests

这三行代码导入了编写爬虫所需的三个库:re用于处理正则表达式,time用于处理时间相关的功能,requests用于发送HTTP请求。

下载网页内容的函数
def?download_page():
????resp?=?requests.get('https://www.cnblogs.com/leyinsec')
????#?解析网页所有超链接
????links?=?re.findall('<a?href="(.+?)"',?resp.text)
????for?link?in?links:
????????#?排除无用链接
????????if?'postid'?in?link?or?'archive'?in?link:
????????????continue
????????elif?link.startswith('javascript'):
????????????continue
????????#?将页面文件保存在本地
????????resp?=?requests.get(link)
????????resp.encoding?=?'utf-8'
????????filename?=?link.split('/')[-1]?+?time.strftime("_%Y%m%d_%H%M%S")?+?'.html'
????????with?open(f'page/leyin?sec博客园/{filename}',?'w',?encoding='utf-8')?as?file:
????????????file.write(resp.text)

这个函数首先发送一个GET请求到指定的URL,然后使用正则表达式查找所有的超链接。对于每个找到的链接,它会检查链接是否包含特定的字符串(如’postid’或’archive’),或者是否以’javascript’开头,如果是,则跳过该链接。对于其他链接,它会发送另一个GET请求以获取网页内容,并将其保存到本地文件系统中,文件名包含时间戳以确保唯一性。

下载图片的函数
def?download_images():
????resp?=?requests.get('https://www.cnblogs.com/leyinsec')
????images?=?re.findall('<img?src="(.+?)"',?resp.text)
????for?image?in?images:
????????if?image.startswith('/'):
????????????image?=?'https://www.cnblogs.com/leyinsec'?+?image
????#?下载图片
????????resp?=?requests.get(image)
????????filename?=?time.strftime("_%Y%m%d_%H%M%S")?+?image.split('/')[-1]
????????with?open('page/leyinsec博客园/photos/'?+?filename,?'wb')?for?file:
????????????file.write(resp.content)

这个函数的工作方式与download_page函数类似,但是它查找的是<img>标签中的src属性。对于每个找到的图片链接,如果链接是相对路径(以’/'开头),它会将其转换为绝对路径。然后,它会发送GET请求以下载图片,并将其保存到本地文件系统中,文件名同样包含时间戳。

主函数调用
if?__name__?==?'__main__':
????download_page()
????download_images()

这段代码确保当脚本作为主程序运行时,调用download_page()download_images()函数来执行网页内容和图片的下载。

注意事项和潜在问题
  1. 硬编码的URL:代码中硬编码了要爬取的网站URL,这限制了脚本的通用性。

  2. 缺乏异常处理:代码中没有处理网络请求可能出现的异常,例如连接错误或HTTP错误状态码。

  3. 缺乏robots.txt检查:代码没有检查目标网站的robots.txt文件,这可能会违反网站的爬虫政策。

  4. 文件路径错误:在download_page函数中,文件路径字符串有一个小错误,leyin?sec应该是leyinsec

  5. 重复下载:代码没有实现去重逻辑,可能会下载重复的网页或图片。

  6. 编码问题:代码假设所有网页和图片都可以使用UTF-8编码,这可能不总是正确的。

  7. 性能问题:对于大型网站,这种简单的递归下载方法可能会导致大量的并发请求,从而对目标服务器造成压力。

总结

这段代码展示了如何使用正则表达式和requests库来爬取网页内容和图片,并将它们保存到本地。然而,代码中存在一些问题和潜在的改进空间,特别是在异常处理、遵守robots.txt规则、错误处理和性能方面。在实际应用中,应该考虑这些问题,并采取相应的措施来提高代码的健壮性和效率。

相关文章:

基于python对网页进行爬虫简单教程

python对网页进行爬虫 基于BeautifulSoup的爬虫—源码 """ 基于BeautifulSoup的爬虫###?一、BeautifulSoup简介1.?Beautiful?Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱&#xff0c;通过解析文档为用户提供…...

【JavaEE进阶】@RequestMapping注解

目录 &#x1f4d5;前言 &#x1f334;项目准备 &#x1f332;建立连接 &#x1f6a9;RequestMapping注解 &#x1f6a9;RequestMapping 注解介绍 &#x1f384;RequestMapping是GET还是POST请求&#xff1f; &#x1f6a9;通过Fiddler查看 &#x1f6a9;Postman查看 …...

【WebAR-图像跟踪】在Unity中基于Imagine WebAR实现AR图像识别

写在前面的话 感慨一下&#xff0c; WebXR的发展是真的快&#xff0c;20年的时候&#xff0c;大多都在用AR.js做WebAR。随着WebXR标准发展&#xff0c;现在诸如Threejs、AFrame、Unity等多个平台都支持里WebXR。 本文将介绍在Unity中使用 Image Tracker实现Web端的AR图像识别功…...

向bash shell脚本传参

例子&#xff1a; ~ script % touch parameter.sh ~ script % chmod 755 parameter.sh ~ % vim parameter.shparameter.sh: #!/usr/bin/env bashecho the name of current script is $0echo the first parameter is $1echo the second parameter is $2echo all parameters: $…...

Oracle中listagg与wm_concat函数的区别

Oracle中listagg与wm_concat都可以用于将多行数据合并成一个字符串的两个函数&#xff0c;区别如下&#xff1a; 1、分隔符&#xff1a;listagg支持指定分隔符&#xff0c;wm_concat默认为"&#xff0c;"不支持指定&#xff1b; 2、排序&#xff1a;listagg支持排序后…...

热更新与资源管理

热更新、资源管理、打包发布是 Unity 游戏开发中关键的技术点。这些功能可以极大地提高项目的灵活性和资源利用效率&#xff0c;尤其是在多平台、长生命周期的游戏项目中。以下从技术概述、知识点分析、实现方法和代码举例逐一进行详细分析。 一、热更新 热更新指在不重新发布…...

Momentum Provably Improves Error Feedback!

以下是您提供的论文摘要的翻译&#xff1a; **摘要** 由于在分布式环境中训练机器学习模型时通信开销较高&#xff0c;现代算法不可避免地依赖于有损通信压缩。然而&#xff0c;如果不加以处理&#xff0c;压缩造成的错误会传播&#xff0c;并可能导致严重的不稳定行为&#…...

Elasticsearch-脚本查询

脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能&#xff0c;ES支持多种脚本语言&#xff0c;如painless&#xff0c;其语法类似于Java,也有注释、关键字、类型、变量、函数等&#xff0c;其就要相对于其他脚本高出几倍的性…...

《Opencv》基础操作详解(3)

接上篇&#xff1a;《Opencv》基础操作详解&#xff08;2&#xff09;-CSDN博客 Opencv基础操作 目录 Opencv基础操作 18、图像边界填充 19、阈值处理&#xff08;图像的二值化&#xff09; 20、图像平滑处理 &#xff08;1&#xff09;、均值滤波&#xff08;Mean Filte…...

meshy的文本到3d的使用

Meshy官方网站&#xff1a; 中文官网&#xff1a; Meshy官网中文站 ​编辑 Opens in a new window ​编辑www.meshycn.com Meshy AI 中文官网首页 英文官网&#xff1a; Meshy目前似乎还没有单独的英文官网&#xff0c;但您可以在中文官网上找到英文界面或相关英文资料。 链…...

C语言技巧之有条件的累加

什么叫有条件的累加&#xff1f; 主要是依靠循环&#xff0c;一般形式是一个在循环里面遍历&#xff0c;另一个只有达到一定的条件才会累加&#xff08;移动到下一个变量&#xff09;&#xff0c;从言语也能看出来&#xff0c;主要是用在字符串和数组里面的&#xff0c;毕竟链表…...

解释为什么fetch(JavaScript)无法将读取的数据存入外部变量

&#xff08;一&#xff09;问题描述 你可能会遇到这样的情况&#xff1a;在fetch之外创建变量&#xff0c;将fetch获取到的数据赋值给这个变量以便在fetch外使用&#xff0c;但在使用这个变量的时候发现值是空的&#xff0c;这是为什么呢&#xff1f; &#xff08;二&#xf…...

Windows Subsystem for Linux (WSL)

目录 定义与功能 版本与特点 应用场景 启用 WSL 功能 更新WSL及其内核 下载Linux发行版本 WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软在Windows 10和Windows 11中引入的一项功能&#xff0c;使用户能够在Windows上原生运行Linux的命令行工具和应用程…...

Go的Slice如何扩容

在Go语言中&#xff0c;slice&#xff08;切片&#xff09;是一个动态数组&#xff0c;其底层实现是基于数组&#xff0c;但提供了更灵活的长度和容量管理。当向slice中添加元素并超出其当前容量时&#xff0c;Go会自动为其分配一个更大的底层数组&#xff0c;并复制现有元素到…...

使用云计算开发App 有哪些坑需要避免

当我们在云计算环境下开发App时&#xff0c;往往会觉得一切都变得“轻松”了。毕竟&#xff0c;云计算提供了无限的计算资源、灵活的存储方案&#xff0c;还有自动化的服务&#xff0c;仿佛有了一个万能的工具箱&#xff0c;啥都能搞定。可是&#xff0c;别被这种“轻松”外表骗…...

ARM 架构--通用寄存器状态寄存器控制寄存器特殊用途寄存器

目录 一?ARM 架构中的寄存器 ARM 架构中的寄存器 通用寄存器 状态寄存器 控制寄存器 特殊用途寄存器 总结 二 通用寄存器 ARM 架构中的通用寄存器 ARMv7 架构 ARMv8 架构 实例 ARMv7 架构 ARMv8 架构 三 状态寄存器 ARM 架构中的状态寄存器 状态寄存器 详细…...

最新SQL Server 2022保姆级安装教程【附安装包】

目录 一、安装包下载&#xff1a; 下载链接&#xff1a;https://pan.quark.cn/s/b1c0c63d61ec 二、安装SQL Server 1.下载安装包后解压出来&#xff0c;双击打开 2.等待加载安装程序 3.点击基本安装 4.点击接受 5.点击浏览 6.在D盘新建文件夹 7.命名为【Sql Server】…...

学习C++:运算符

运算符 作用&#xff1a;用于执行代码的运算 一&#xff0c;算数运算符 作用&#xff1a;用于处理四则运算 &#xff08;在除法运算中&#xff0c;除数不可以为0&#xff09; 两个小数不可以做取模运算 &#xff08;只有整型变量可以进行取模运算&#xff09; 二&#xff0…...

pdf有密码,如何实现pdf转换word?

PDF想要转换成其他格式&#xff0c;但是当我们将文件拖到PDF转换器进行转换的时候发现PDF文件带有密码怎么办&#xff1f;今天分享PDF有密码如何转换成word方法。 方法一、 PDF文件有两种密码&#xff0c;打开密码和限制编辑&#xff0c;如果是因为打开密码&#xff0c;建议使…...

AI发展新态势:从技术突破到安全隐忧

AI安全的新挑战 近期AI领域出现了令人担忧的新发现。根据最新研究,AI模型已经开始展现出策略性欺骗的倾向。具体表现在以下几个方面: 策略性欺骗行为的出现 在实验中发现,当研究人员试图让AI执行一些"反Anthropic"的操作时(如获取模型权限和外部服务器访问),模…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...