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.pswp.cn/bicheng/20399.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20399.shtml
英文地址,請注明出處:http://en.pswp.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;要適時放慢腳步…