python爬虫之JS逆向——网页数据解析

目录

一、正则

1 正则基础

元字符

基本使用

通配符: '.'

字符集: '[]'

重复

位置

管道符和括号

转义符

转义功能

转义元字符

2 正则进阶

元字符组合(常用)

模式修正符

 re模块的方法

有名分组

compile编译

二、bs4

1 四种对象

2 导航文档树

嵌套选择

子节点、子孙节点

父节点、祖先节点

兄弟节点

3 搜索文档树

name参数

  标签名

  正则表达式

  列表

  函数(精致过滤)

关键字参数

文本参数

4 CSS选择器

三、xpath

1 路径表达式

2 谓语

3 通配符

4 其他用法

5 文件操作

文件句柄

读操作

写操作 

覆盖写

追加写


一、正则

是描述一段文本排列规则的表达式
正则表达式并不是python的一部分,而是一套独立于编程语言,用于处理复杂文本信息的强大的高级文本操作工具。
python提供re模块或regex模块来调用正则处理引擎

正则对字符串的操作:分割、匹配、查找和替换

1 正则基础

元字符

元字符是具有特殊含义的字符

元字符描述
[]匹配一个中括号中出现的任意一个原子
[^原子]匹配一个没有在中括号中出现的任意原子
\转义字符,可以把原子转换特殊元字符,也可以把特殊元字符转换成原子
^叫开始边界符或开始锚点符,匹配一行的开头位置
$叫结束边界符或开始锚点符,匹配一行的结束位置
.叫通配符、万能通配符或通配元字符,匹配一个除了换行符\n以外任何原子
*叫星号贪婪符,指定左边原子出现0次或多次
?叫非贪婪符,指定左边原子出现0次或1次
+叫加号贪婪符,指定左边原子出现1次或多次
{n,m}

叫数量范围贪婪符,指定左边原子的数量范围,有{n},{n,},{,m},{n,m}四种写法,

其中n与m必须是非负整数

|指定原子或正则模式进行二选一或多选一
()对原子或正则模式进行捕获提取和分组划分整体操作

举例和一些特殊组合如下所示

基本使用
import reret1 = re.findall("a", "a,b,c,d,e")  # ['a']
通配符: '.'
ret2 = re.findall(".", "a,b,c,d,e")  # ['a', ',', 'b', ',', 'c', ',', 'd', ',', 'e']
ret2 = re.findall("a.b", "a,b,c,d,e,acb,abb,a\nb,a\tb")  # ['a,b', 'acb', 'abb', 'a\tb']
字符集: '[]'
ret3 = re.findall("[ace]", "a,b,c,d,e")  # ['a', 'c', 'e']
ret3 = re.findall("a[bce]f", "af,abf,abbf,acef,aef")  # ['abf', 'aef']
ret3 = re.findall("[a-zA-Z]", "a,b,c,d,e,A,V")  # ['a', 'b', 'c', 'd', 'e', 'A', 'V']
ret3 = re.findall("[a-zA-Z0-9]", "a,b,c,d,1,e,A,V")  # ['a', 'b', 'c', 'd', '1', 'e', 'A', 'V']
ret3 = re.findall("[^0-9]", "a,2,b,c,d,1,e,A,V")  # ['a', ',', ',', 'b', ',', 'c', ',', 'd', ',', ',', 'e', ',', 'A', ',', 'V']
# [0-9] == \d [a-zA-Z0-9] == \w
重复

'*' :1-多次

'+' :0-多次

'?' :0/1次, 也可取消贪婪匹配

'{m,n}' :m-n次

贪婪匹配,每次为最多次匹配

?取消贪婪匹配

ret4 = re.findall("\d+", "a,b,234,d,6,888")  # ['234', '6', '888']
# ?取消贪婪匹配
ret4 = re.findall("\d+?", "a,b,234,d,6,888")  # ['2', '3', '4', '6', '8', '8', '8']

+

ret4 = re.findall("\w", "apple,banana,orange,melon")  # ['a', 'p', 'p', 'l', 'e', 'b', 'a', 'n', 'a', 'n', 'a', 'o', 'r', 'a', 'n', 'g', 'e', 'm', 'e', 'l', 'o', 'n']
ret4 = re.findall("\w+", "apple,banana,orange,melon")  # ['apple', 'banana', 'orange', 'melon']
ret4 = re.findall("\w+?", "apple,banana,orange,melon")  # ['a', 'p', 'p', 'l', 'e', 'b', 'a', 'n', 'a', 'n', 'a', 'o', 'r', 'a', 'n', 'g', 'e', 'm', 'e', 'l', 'o', 'n']

 注:"\w*" == ""和"\w"

*

ret4 = re.findall("\w*", "apple,banana,orange,melon")  # ['apple', '', 'banana', '', 'orange', '', 'melon', '']
ret4 = re.findall("abc*", "abc,abcc,abe,ab")  # ['abc', 'abcc', 'ab', 'ab']

?

ret4 = re.findall("\w{6}", "apple,banana,orange,melon")  # ['banana', 'orange']

{m,n}

ret4 = re.findall("abc?", "abc,abcc,abe,ab")  # ['abc', 'abc', 'ab', 'ab']
ret4 = re.findall("abc??", "abc,abcc,abe,ab")  # ['ab', 'ab', 'ab', 'ab']
位置

'^' :匹配开头符合条件的字符

'$' :匹配结尾符合条件的字符

^

ret5 = re.findall("^\d+", "34,banana,255,orange,5434")  # ['34']
ret5 = re.findall("^\d+", "peath,34,banana,255,orange,5434")  # []

$

ret5 = re.findall("\d+$", "34,banana,255,orange,5434")  # ['5434']
ret5 = re.findall("\d+$", "peath,34,banana,255,orange")  # []
管道符和括号

|:或

():优先提取/括号

(?:) 取消模式捕获

ret6 = re.findall(",(\w{5}),", ",apple,banana,peach,orange,melon,")  # ['apple', 'peach', 'melon']
ret6 = re.findall("\w+@(163|qq)\.com", "123abc@163.com...789xyz@qq.com")  # ['163', 'qq']
ret6 = re.findall("\w+@(?:163|qq)\.com", "123abc@163.com...789xyz@qq.com")  # ['123abc@163.com', '789xyz@qq.com']

转义符

转义的两个功能

将一些普通符号赋予特殊功能  \d \w ...

将特殊符号取消其特殊功能  * . + ...

转义功能
ret7 = re.findall("\(abc\)", "(abc)...")  # ['(abc)']
转义元字符
特殊模式描述
\d匹配任意一个数字(0-9)[0-9]
\D匹配任意一个非数字字符[^0-9]/[^\d]
\w匹配任意一个字母、数字或下划线(单词字符)[A-Za-z0-9_]
\W匹配任意一个非字母、非数字、非下划线字符[^A-Za-z0-9_]\[^\w]
\s匹配任意一个空白字符(空格、制表符、换行符等)[ \f\n\r\t\v]
\S匹配任意一个非空白字符[^ \f\n\r\t\v]\[\s]
\b匹配单词边界
\B匹配非单词边界[^\b]
\n匹配一个换行符
\r匹配一个回车符
\t匹配一个制表符
\v匹配一个垂直制表符
\f匹配一个换页符
\\匹配一个反斜杠
\0匹配一个 NULL 字符

2 正则进阶

元字符组合(常用)

.*?

.+?

text1 = '<12> <xyz> <!@#$%> <1a!#e2> <>'
ret1 = re.findall("<\d+>", text1)  # ['<12>']
ret1 = re.findall("<\w+>", text1)  # ['<12>', '<xyz>']
ret1 = re.findall("<.+>", text1)  # ['<12> <xyz> <!@#$%> <1a!#e2> <>']
ret1 = re.findall("<.+?>", text1)  # ['<12>', '<xyz>', '<!@#$%>', '<1a!#e2>']
ret1 = re.findall("<.*?>", text1)  # ['<12>', '<xyz>', '<!@#$%>', '<1a!#e2>', '<>']
text2 = '''<12
><xyz><!@#$%><1a!#
e2><>
'''ret2 = re.findall("<.*?>", text2)  # ['<!@#$%>', '<>']
ret2 = re.findall("<.*?>", text2, re.S)  # ['<12\n>', '<x\n yz>', '<!@#$%>', '<1a!#\ne2>', '<>']

模式修正符

修正符re模块提供的变量描述
ire.I使模式对大小写不敏感,也就是不区分大小写
mre.M使模式在多行文本中可以多个行头和行位,影响^和$
sre.S让通配符,可以代表所有的任意原子(包括换行符\n在内)
import reret = re.findall('.*?<span class="title">(.*?)</span>.*?<span class=\"rating_num\".*?>(.*?)</span>',s,re.S,
)
print(ret)
print(len(ret))

 re模块的方法

re.Match对象对应两个方法
ret.span()  返回符合规则的字符串的出现位置,为元组
ret.group()  返回第一个匹配字符串

函数描述
findall按指定的正则模式查找文本中符合正则模式的匹配项,以列表格式返回结果
search在字符串的任何位置查找首个符合正则模式的匹配项,存在返回re.Match对象,不存在返回None
match判定字符串开始位置是否匹配正则模式的规则,匹配返回re.Match对象,不匹配返回None
split按指定的正则模式来分割字符串,返回一个分割后的列表
sub/subn把字符串按指定的正则模式来查找符合正则模式的匹配项,并可以替换一个或多个匹配项成其他内容
compile将规则编译,可以重复使用
有名分组

<name>

search和match的区别:
search在任何位置找,match从开头找

ret3 = re.search("(?P<tel>1[3-9]\d{9}).*?(?P<email>\d+@qq\.com)", "我的手机号是18793437893,我的邮箱是123@qq.com")print(ret3.group())  # 18793437893,我的邮箱是123@qq.com
print(ret3.group("tel"))  # 18793437893
print(ret3.group("email"))  # 123@qq.com
compile编译
s1 = "12 apple 34 peach 21 banana"
s2 = "18 apple 12 peach 33 banana"
reg = re.compile(r"\d+")print(reg.findall(s1))
print(reg.findall(s2))

二、bs4

bs4:Beautiful Soup是python的一个库,主要功能是从网页抓取数据。

需要安装两个库
pip install bs4
pip install lxml

 基本使用顺序如下所示:

# 调用bs4库
from bs4 import BeautifulSoup# 读文件
with open("第一阶段-爬虫\\JS逆向\\3-网页数据解析\\bs4\\demo.html", "r", encoding="utf-8") as f:s = f.read()# 创建bs4对象
soup = BeautifulSoup(s, 'html.parser')# 或者使用如下方式
soup = BeautifulSoup(open("第一阶段-爬虫\\JS逆向\\3-网页数据解析\\bs4\\demo.html",  encoding="utf-8"), "html.parser")

1 四种对象

BeautifulSoup

Tag

NavigableString

Comment

主要使用BeautifulSoup和Tag对象 

from bs4 import BeautifulSoupwith open("第一阶段-爬虫\\JS逆向\\3-网页数据解析\\bs4\\demo.html", "r", encoding="utf-8") as f:s = f.read()soup = BeautifulSoup(s, 'html.parser')# Tag查找标签
# 如果查到,一定是一个Tag对象
print(soup.body)
print(type(soup.body))print(soup.div.a)  # <a class="nav-login" href="https://accounts.douban.com/passport/login?source=movie" rel="nofollow">登录/注册</a>
print(soup.div.a.name)  # aprint(soup.a["href"])  # https://accounts.douban.com/passport/login?source=movie
print(soup.a.attrs)  # {'href': 'https://accounts.douban.com/passport/login?source=movie', 'class': ['nav-login'], 'rel': ['nofollow']}# 拿取文本
print(soup.a.string)  # 登录/注册
print(soup.a.text)  # 登录/注册print({link.text:link["href"] for link in soup.find_all("a")})

2 导航文档树

嵌套选择
子节点、子孙节点
父节点、祖先节点
兄弟节点

导入文件并创建对象

from bs4 import BeautifulSoupwith open("第一阶段-爬虫\\JS逆向\\3-网页数据解析\\bs4\\demo.html", "r", encoding="utf-8") as f:s = f.read()soup = BeautifulSoup(s, 'html.parser')

嵌套选择

# 嵌套选择
print(soup.head.title.text)
print(soup.body.a.text)

子节点、子孙节点

# 子节点、子孙节点
print(soup.p.contents)  # p下所有子节点
print(soup.p.children)  # 得到一个迭代器,包含p下所有子节点
print(soup.p.descendants)  # 获取子孙节点,p下所有标签都会选择出来

父节点、祖先节点

# 父节点、祖先节点
print(soup.a.parent)  # 获取a标签的父节点
print(soup.a.parents)  # 获取a标签所有祖先节点,父亲、爷爷等等

兄弟节点

# 兄弟节点
print(soup.a.next_sibling)  # 下一个兄弟
print(soup.a.next_sibling.next_sibling)  # 下下一个兄弟,以此类推
print(soup.a.previous_sibling)  # 上一个兄弟
print(soup.a.previous_sibling.previous_sibling)  # 上上一个兄弟

3 搜索文档树

fand_all()
name参数(标签名过滤):字符串、正则表达式、列表、方法
字符串:即标签名

关键字参数(属性过滤)

文本参数(文本过滤)

find()
与find_all()的区别:find()只查找第一个
参数完全一样

find_parents()  找所有父亲标签
find_parent()  找父亲标签

优点:只包含兄弟标签
find_next_siblings()  找下边所有兄弟标签
find_next_sibling()  找下边一个兄弟标签
find_previous_siblings()  找上边所有兄弟标签
find_previous_sibling()  找上边一个兄弟标签

find_all_next()  找下边所有相同标签
find_next()  找下边相同标签

这里使用find_all()方法举例,其余搜索使用方法几乎相同

name参数

  标签名
# name参数:标签名
ret1 = soup.find_all(name="a")  # 查找所有a标签
print(ret1)
  正则表达式
# name参数:正则表达式
ret2 = soup.find_all(name=re.compile("^a"))
print(ret2)
  列表
# name参数:列表
ret3 = soup.find_all(name=["a", "b"])
print(ret3)
  函数(精致过滤)
# name参数:函数(精致过滤)# 表示拥有class和id两个属性的标签
def has_class_has_id(tag):return tag.has_attr("class") and tag.has_attr("id")print(soup.find_all(name=has_class_has_id))

关键字参数

ret4 = soup.find_all(href="https://img1.doubanio.com/cuphead/movie-static/pics/apple-touch-icon.png"
)
ret4 = soup.find_all(attrs={"href": "https://img1.doubanio.com/cuphead/movie-static/pics/apple-touch-icon.png"}
)
ret4 = soup.find_all(href=re.compile("^https://"), class_="download-android", id="id1")
print(ret4)

文本参数

ret5 = soup.find_all(string="豆瓣")
ret5 = soup.find_all(string=re.compile("豆瓣"))  # 查找含有"豆瓣"的文本
ret5 = soup.find_all(string=re.compile("豆瓣"), limit=1)  # 查找含有"豆瓣"的文本,只取第一个
print(ret5)

4 CSS选择器

与CSS中选择器用法相同
select()方法或者在搜索中使用

from lxml import etree
selector = etree.HTML(源码)  # 将源码转换为能被XPath匹配的格式
ret = selector.xpath(表达式)  # 返回为一列表


例:soup.select("body a")

from bs4 import BeautifulSoup
import resoup = BeautifulSoup(open("第一阶段-爬虫\\JS逆向\\3-网页数据解析\\正则\\豆瓣top250.html",  encoding="utf-8"), "html.parser")items = soup.find_all(class_="item")
print(len(items))for item in items:title = item.find(class_="title").stringrating_num = item.find(class_="rating_num").stringstar = item.find(class_="star").find_all("span")[-1].stringprint(title, rating_num, star)

三、xpath

xpath:一种小型的查询语言,属于lxml库模块

使用方式:

from lxml import etree
selector = etree.HTML(源码)  # 将源码转换为能被XPath匹配的格式
ret = selector.xpath(表达式)  # 返回为一列表

1 路径表达式

表达式描述实例解析
/从根节点选取/body/div[1]选取根节点下的body下的第一个div标签
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置//a选取文档中所有的a标签
./从当前节点再次进行xpath./a选取当前节点下的所有a标签
@选取属性//@class选取所有的class属性

2 谓语

是放在方括号[]里,用来查找某个特定的节点或者包含某个指定值的节点

路径表达式结果
/ul/li[1]选取属于ul元素的第一个li元素
/ul/li[last()]选取属于ul元素的最后一个li元素
/ul/li[last-1]选取属于ul元素的倒数第二个li元素
/ul/li[position()<3]选取最前面的两个属于ul元素的子元素的li元素
//a[@title]选取所有拥有名为title属性的a元素
//a[@title='xx']选取所有拥有title属性,并且属性值为'xx'的a元素
//a[@title>10] > < >= <= !=选取所有拥有title属性,并且属性值为大于10的a元素
/body/div[@price>35.00]选取body下price元素值大于35的div节点

3 通配符

xpath的通配符可以选取未知节点

通配符描述
*匹配任何元素节点
@*匹配任何属性节点
node()匹配任何类型节点

4 其他用法

表达式

结果

//xx[@id="" and @class=""]获取满足两者要求的元素
//xx | //xx获取若干路径的元素
//xx[id/@class=""]获取xx标签中包含或者对应id/class的元素
//xx[n]获取xx标签的第n个元素,索引从1开始,last()获取最后一个
//xx[starts-with(@id, "ll")]获取xx标签中id属性中以ll开头的,class类似
//xx[contains(@id, "ll")]获取xx标签中id属性中包含ll的,class类似
//xx/text()获取xx标签中的文本值
//div/a/@href获取a标签中的href属性值
//*获取所有,例//*[@class="xx"]:获取所有class为xx的标签

 获取节点内容转换成字符串

c = tree.xpath('//li/a')[0]
result = etree.tostring(c, encoding='utf-8')
print(result.decode('utf-8'))

5 文件操作

文件句柄

open()方法

mode参数为对文件的操作,r只读,w只写,rw读写...

encoding表示编码方式

绝对路径

filer = open("D:/桌面/Python自学/第一阶段-爬虫/JS逆向/3-网页数据解析/xpath/豆瓣top250.html",mode="r",encoding="utf-8",
)

相对路径

file = open("/豆瓣top250.html", mode="r",encoding="utf-8",)

读操作

方法功能
file.read()直接获取文件内容,参数为整型数字,光标按字移动
file.readline()按行获取文件内容,参数为整型数字,光标按字移动
file.readlines()获取文件所有行,放在列表中,参数为整型数字,光标按行移动

通常以以下方式循环高效获取数据:

for line in file:print(line)

写操作 

覆盖写

会将源文件内容清空再存入

filew = open("write.txt",mode="w",encoding="utf-8",
)filew.write("")
filew.close()
追加写
filew = open("write.txt",mode="a",encoding="utf-8",
)filew.write("")
filew.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/20399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue:Bin Code Editor格式化JSON编辑器

最终效果如下图所示&#xff0c; Bin Code Editor安装 npm或yarn安装命令如下&#xff0c; npm i bin-code-editor -S # or yarn add bin-code-editor 组件注册 全局注册 在 main.js 中写入导入以下内容&#xff0c; import Vue from vue; import CodeEditor from bin-cod…

服务器数据恢复—异常断电导致ESXi虚拟机无法启动的数据恢复案例

服务器数据恢复环境&#xff1a; 某大厂PS4000服务器&#xff0c;服务器上部署VMware ESXi虚拟化平台。 服务器故障&#xff1a; 机房断电&#xff0c;重启后服务器中的某台虚拟机不能正常启动。管理员查看虚拟机配置文件&#xff0c;发现无法启动的虚拟机的配置文件除了磁盘文…

【每日刷题】Day53

【每日刷题】Day53 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1019. 链表中的下一个更大节点 - 力扣&#xff08;LeetCode&#xff09; 2. 116. 填充每个节点的下一…

Exce 两列一组对齐呈现,缺失补 0

Excel 里有 多 组数据&#xff0c;每组 2 列&#xff0c;每组长度不同。第 1 列是编号&#xff0c;列之间的编号有重复。 ABCDEFGH1Mass10Mass11Mass12Mass132802200581309088146532802225938133306824779282975598142002482273148413154988335698822331305832720485110460842…

计算机考研|408 值得选择吗?有哪些优势?

408当然非常值得报考&#xff0c;但是现在的408已经卷麻了&#xff01; 现在越来越多的学校改考408&#xff0c;光今年就有6所发布通知&#xff0c;宣布改考408&#xff0c;分别是&#xff1a; 这对考408的学生肯定是好消息&#xff0c;后面可能还会有学校陆续改考&#xff0c;…

一、实现一个简单的 Google Chrome 扩展程序

目录 &#x1f9ed; 效果展示 # 图示效果 a. 拓展程序列表图示效果&#xff1a; b. 当前选项卡页面右键效果&#xff1a; c. 拓展程序消息提示效果&#xff1a; &#x1f4c7; 项目目录结构 # 说明 # 结构 # 文件一览 ✍ 核心代码 # manifest.json # background.j…

SLAM ORB-SLAM2(26)重定位过程

SLAM ORB-SLAM2(26)重定位过程 1. 前言2. 词袋模型2.1. 加快搜索2.2. 在文本检索的应用2.3. 引入视觉图像分类3. 重定位总体过程3.1. 计算当前帧特征点的词袋向量3.2. 根据用词袋查找相似的候选关键帧3.3. 通过词袋模型进行初步匹配3.4. 查询较匹配的关键帧3.4.1. 通过PnP投影…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第五套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第五套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff0c;每套四十题选择题&#xff09;获取&#xff08;WX:…

java期末细节知识整理(一)

1.java程序的执行过程&#xff1a;先编译后解释。也就是我们在idea写的文件叫做java源文件&#xff08;.java结尾的文件&#xff09;&#xff0c;经过编译器会生成字节码文件&#xff08;.class结尾的文件&#xff09;&#xff0c;再通过解释器进行实现 2.栈用来存储引用类型的…

易语言本地IP一键切换程序(附带源码)

易语言本地IP一键切换程序 效果图部分源码源码领取下期更新预报 效果图 部分源码 .判断开始 (单选框1.选中 &#xff1d; 真)标签5.标题 &#xff1d; #换行符 &#xff0b; “正在切换IP.”.如果真 (运行 (“netsh interface ip set address ” &#xff0b; #引号 &#xff…

PHP火狼大灌篮游戏源码微信+手机wap源码带控制

使用此接口可以实现支付宝、QQ钱包、微信支付与财付通的即时到账&#xff0c;免签约&#xff0c;无需企业认证。PHP易支付源码&#xff0c;免签约不需要企业的支付平台源码&#xff0c;彩虹第三四方在线支付系统源码,易支付token合作者商户申请源码&#xff0c;app和网页都可以…

ubuntu--Linux运行时格式

Linux运行时格式 \r 错误 用vim打开那个执行错误的 sh脚本文件 进入最后一行模式下 :set ff显示 fileformatdos 解决方法 : :set ffunix查看是否更改 : :set ff结果 : 保存退出即可 :x运行, 没有出错 * Author: cpu_code * Date: 2020-07-29 19:07:52 * LastEditTime: 2020…

day25回溯算法part02| 216.组合总和III 17.电话号码的字母组合

216.组合总和III 题目链接/文章讲解 | 视频讲解 class Solution { public:vector<vector<int>> result;vector<int> path;int sum;void backtracking(int n, int k, int startindex) {// int sum accumulate(path.begin(), path.end(), 0);if (sum n &am…

HTTP --tcp

TCP TCP连接 tcp/ip是全球计算机以及网络设备都在使用的一种常见的分组交换网络分层协议集&#xff0c;客户端可以打开一条tcp/ip连接&#xff0c;连接到可能运行在世界各地的服务器应用程序&#xff0c;一旦连接建立起来了&#xff0c;在客户端和服务器的计算机之间交换的报…

@autowired 注入进来对象为null的几种场景及解决办法

一、原因 Autowired 注解用于自动注入 Spring 容器中管理的依赖对象。如果注入的对象为 null&#xff0c;可能是以下原因之一&#xff1a; 被注入的对象没有被 Spring 容器管理&#xff0c;即没有被 Spring 扫描到或者没有配置相应的 。注入的对象在 Spring 容器中有多个实例…

el-date-picker的使用,及解决切换type时面板样式错乱问题

这里选择器的类型可以选择日月年和时间范围&#xff0c;根据类型不同&#xff0c;el-date-picker的面板也展示不同&#xff0c;但是会出现el-date-picker错位&#xff0c;或者面板位置和层级等问题。 源代码&#xff1a; <el-selectv-model"dateType"placeholder&…

BOOST_SREATCH

BOOST Boost是一个由C社区开发的开源库&#xff0c;为C语言标准库提供扩展。这个库由C标准委员会库工作组成员发起&#xff0c;旨在提供大量功能和工具&#xff0c;帮助C开发者更高效地编写代码。Boost库强调跨平台性和对标准C的遵循&#xff0c;因此与编写平台无关&#xff0…

PyCharm设置前端:全面解析与个性化配置指南

PyCharm设置前端&#xff1a;全面解析与个性化配置指南 PyCharm&#xff0c;作为一款强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;在编程界享有极高的声誉。然而&#xff0c;对于许多前端开发者来说&#xff0c;如何在PyCharm中设置和优化前端工作环境可…

如何防止商业秘密泄露?商业秘密保护措施有哪些?

商业秘密是企业核心竞争力的关键所在&#xff0c;其保密性直接关系到企业的生存和发展。 因此&#xff0c;防止商业秘密泄露&#xff0c;确保商业秘密的安全至关重要。 本文将探讨如何有效防止商业秘密泄露&#xff0c;并重点介绍域智盾软件作为解决方案&#xff0c;在商业秘密…

Jvm(一)之栈、堆、方法区

前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#xff0c;感受周围的世界。让我们一起提醒自己&#xff0c;要适时放慢脚步…