網(wǎng)站首頁 編程語言 正文
前言
有玩過爬蟲的人應(yīng)該都有過在又臭又長(zhǎng)的HTML中找尋信息的經(jīng)歷,雖然有各種工具和各種框架可以輔助查找,但是解析HTML的規(guī)則也是人想的,制定規(guī)則也是十分麻煩的。
恰好在個(gè)人的項(xiàng)目中,需要從某個(gè)網(wǎng)站中爬取圖片,好在需求比較簡(jiǎn)單,所以試著使用正則表達(dá)式來解決。
分析
每個(gè)網(wǎng)站中展示圖片的地方,無非就是img標(biāo)簽或者style中background-image和background,先解決img標(biāo)簽中的圖片。
首先,地址在標(biāo)簽的src屬性之中,所以找尋src的位置是必須的。但是不只有img標(biāo)簽擁有src屬性,video和style也同樣擁有src屬性。因此,只匹配src的位置是不夠,還得確保這個(gè)src的位置在img標(biāo)簽中。
然后,就是匹配src后面的地址,匹配地址的方法已經(jīng)有許多文章描述過了,不再多說,但本文中用了一個(gè)比較取巧的方式去匹配。
總的思路就是先匹配src的位置,在獲取圖片地址。
正則表達(dá)式
- 首先是匹配src的位置,既然是找位置,那就需要用的正則表達(dá)式中預(yù)查(?),因?yàn)樾枰膱D片地址是在src后面,所以用反向肯定預(yù)查,所以初步確定正則表達(dá)式可寫成:
/(?<=判斷條件)/ 至于反向肯定預(yù)查的判斷條件,就是在img之后的src,所以正則表達(dá)式改成如下: /(?<=(img src="))/ 之所以匹配src=", 是因?yàn)橄胍苯泳推ヅ涞降刂返拈_頭位置,于是就順手加上。
但是,因?yàn)閕mg和src之間可能還存在class或者其他自定義屬性,所以還要加上這些可能存在字符的匹配。但是因?yàn)檫@些字符的種類比較多,如雙引號(hào)"",英文、數(shù)字、甚至是中文等等,一一匹配過于麻煩,有個(gè)取巧的方式就是匹配非>。
眾所周知,>在HTML中是一個(gè)標(biāo)簽的結(jié)尾,所以它不可能出現(xiàn)在img標(biāo)簽內(nèi)的img字符和src字符的中間,所以匹配位置的正則表達(dá)式可寫成: /(?<=(img[^>]*src="))/
可以看到,能夠成功找到圖片地址的開頭位置。
- 既然位置找到了,那剩下的就是匹配地址了。這里可以使用其他相關(guān)文章說的匹配地址的正則表達(dá)式,但是和上面一樣,同樣可以取巧。
在HTML
標(biāo)簽中,圖片地址是以雙引號(hào)"
開頭和結(jié)尾的,上面的匹配位置已經(jīng)匹配到圖片開頭的雙引號(hào)之后,那么圖片地址還剩下一個(gè)雙引號(hào),就是結(jié)尾的那個(gè)。
那么,直接匹配所有連續(xù)不為"
的字符不就可以了,思路可能有點(diǎn)復(fù)雜,但是寫起來簡(jiǎn)單:
/[^"]*/
- 因此,總的正則表達(dá)式為:
/(?<=(img[^>]*src="))[^"]*/g
結(jié)尾加個(gè)g
是表示匹配所有符合條件的字符串,現(xiàn)在就可以匹配出圖片地址了:
總結(jié)
原文鏈接:https://juejin.cn/post/7107036013582614536
相關(guān)推薦
- 2022-08-01 Android開發(fā)之Flutter與webview通信橋梁實(shí)現(xiàn)_Android
- 2022-10-22 Golang?中反射的應(yīng)用實(shí)例詳解_Golang
- 2022-08-06 python實(shí)現(xiàn)去除空格及tab換行符的方法_python
- 2023-02-17 GO項(xiàng)目實(shí)戰(zhàn)之Gorm格式化時(shí)間字段實(shí)現(xiàn)_Golang
- 2022-08-06 Qt編寫顯示密碼強(qiáng)度的控件_C 語言
- 2022-03-04 在項(xiàng)目中 npm i報(bào)錯(cuò) npm WARN optional SKIPPING OPTIONAL D
- 2022-07-13 File類的基本運(yùn)用、查找、刪除
- 2021-10-12 shell實(shí)現(xiàn)Fisher–Yates?shuffle洗牌算法介紹_linux shell
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支