Vue自定義指令及實現圖片懶加載指令
1092
2022-05-29
在 Python 爬蟲采集領域,正則表達式到底要學多深?
同理,XPath 表達式要學多少才夠用?
這兩個問題是很多爬蟲新人的疑問,而且這兩個問題還沒有標準答案……
本篇博客為你梳理,在初學爬蟲階段,二者你應該學到何種地步,給你定一個小目標,即初學的范圍。
正則表達式
正則表達式在 Python 中,主要配合 re 模塊使用,該模塊應用難度不大,但正則表達式編寫卻困擾很多朋友。
正則難寫的原因如下:
它也算是一門獨立的編程語言,有自己的規范;
正則表達式獨立于任何編程語言,也表示它可以和任意編程語言結合;
每個人寫出的表達式不一致,即“每題”的答案都不唯一;
正則有語法,有修飾符,有元字符,有運算符的優先級,初學階段概念有點龐雜,無從下手。
既然已經分析到正則難寫的原因,那接下來逐一克服即可。
首先要明確第一個概念,正則是干什么的?
簡單理解,正則表達式就是一種文本(字符串)的檢索模式,它可以從一個長字符串中,匹配出目標字符串。
例如從 abc1234dfertg 中提取 1234。
初學正則
初學階段,上來要做的事情是了解正則的基本語法,從字符開始進行學習。
普通字符
這個是非常簡單的,例如 a,1 就是一個普通字符,應用到正則表達式里面,就可以去匹配指定字符串的 a 或者 1。
順著字符就擴展出來正則的核心內容了,元字符。
元字符
元字符就是,在正則中有特殊的含義的一些語法表述。
常見的元字符如下:
\d:匹配一個數字;
\w:匹配字母、數字、下劃線;
這里就會出現一個學習階段的門檻,記憶元字符。
在初學階段,尤其是初學 Python 爬蟲采集階段,那按照如下順序記憶即可(必須掌握)。
.:匹配除換行符(\n、\r)之外的任何單個字符,一般比較簡單的正則用 . 能匹配大多數內容了;
*:匹配前面的表達式 0 次~無限次;
+:匹配前面的表達式 1 次~無限次;
?:匹配前面的子表達式 0 次或 1 次,這個 ? 還有一個用途為【當該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時,匹配模式是非貪婪的,非貪婪模式表示盡可能少的匹配所搜索的字符串】,這個有點繞,后文有參考案例;
\:轉義符,例如你想要匹配 .,需要用 \.;
\s:注意是小寫 s,匹配任何空白字符,包括空格、制表符、換頁符等等,在解析 HTML 的時候,很常用,因為網頁源碼中經常出現換行情況;
[xyz]:匹配中框好中的任意一個字符;
(pattern):分組,并匹配出 pattern;
掌握并熟練的使用以上 8 個元字符,在初學爬蟲階段,一般的網頁就能暢通無阻的進行解析了。
解釋一下貪婪模式。
如果存在一個字符串為 www.csdn.com,你編寫了正則如下:w+,此時能匹配到 www,該正則會盡可能多的去匹配 w 字符,當修改正則為:w+? 時,匹配到的結果為 w,即盡可能少的匹配,也就是 元字符 ? 使得正則變為了非貪婪模式。
初學正則在爬蟲中的落地
有了上述元字符概念,你在去復盤爬蟲 120 例之前的正則部分文章,會發現出現過很多次如下正則: (.*?),此時就能理解其含義,并且你也能知道,這是最普通的正則表達式,只能算是偷懶之作,但是寫起來確實方便。
如果碰到的網頁出現了換行或者空格,那上述正則將演變為 (.|\s)*?,結合上文的必背元字符,你能理解其含義嗎?
理解不了去學習就對了,畢竟我們又引入了一個元字符 |,.|\s 表示選擇,匹配 . 或 \s,即匹配任意字符在加上空格。
基本的元字符熟悉之后,才能進行更多的擴展,學習其它元字符,使得你的正則表達式寫的標準與高效。
除了元字符外,對于正則還需要學習的是修飾符,該內容不多,有如下幾種:
i:忽略大小寫;
g:全局匹配;
m:多行匹配;
s:. 圓點符號,支持匹配空格。
這些內容不重點講解的原因是:不同的編程語言有其特殊的實現方式,具體需要依舊語言本身來實現,例如 Python 的 re 模塊,就有針對性的實現,你可以去檢索 re 模塊相關用法。
其余進階內容,請重點圍繞正則分組進行學習,該部分將在后期總結篇展現。
XPath 表達式
XPath 即 XML Path,一種在 XML 文檔中查找節點元素的語言。
如果深入研究,XPath 依舊有非常多的知識點需要補充,但是作為初學爬蟲采集,優先掌握如下內容即可。
初學階段必會語法
XPath 路徑表達式
這個路徑與電腦硬盤路徑獲取基本一致。
先區分好 / 與 //,它們分別表示從根節點選擇,或者從任意位置的某個節點進行選擇。
例如存在如下 XML 文檔,根階段為 root,其它內容如下所示
例如 /root/book,表示從根節點開始選擇 book 節點,如果使用 /book,則無法匹配到任何數據。
使用 //book,則可以匹配到所有 book 元素。
直接使用 book 也可以匹配出所有的 book 節點。
XPath 測試方法,可以創建一個 HTML 文件,在后在開發者工具中使用 Ctrl+F 換出搜索框,即可測試,如下圖所示。
當然瀏覽器會自動生成 HTML ,HEAD,BODY 節點,正常讀取即可。
有了根節點概念之后,就可以類別出 . 表示當前節點,.. 表示當前節點父節點。當然還有 @ 可以選擇某個屬性,例如下述 XPath 表示提取 book 節點中 bid=1 的節點,語法格式如下:
/html/body/root/book[@bid=1]
提煉一下語法格式如下:
標簽名[@屬性=‘屬性值’] # 如果是屬性值為數字,去掉雙引號也是可以的
如果直接使用 @屬性,表示提取具備該屬性的節點。
其它選擇元素的方法
選擇未知元素
在 XPath 中,可以使用 * 選擇未知的節點,例如 /book/*/name,表示選擇 book 節點下所有節點的 name 節點。
選擇謂語
謂語表示查找某個特定的節點,或者包含某個指定的值的節點,謂語嵌套在 [] 中,例如:
選擇第一個元素 /root/book[1],選擇最后一個元素 /root/book[last()],上文提及的屬性選擇,也屬于謂語的一種用法。
提取屬性值或者標簽中的文本值
在爬蟲采集的時候,經常會用到提取標簽的屬性值,或者提取標簽內部的文本值,提取標簽屬性值可參考如下案例:/book/@cid,提取標簽文本,可參考案例為://book/text()。
以上內容即為初學階段需要掌握的 XPath 相關知識,當然多多益善,有的地方會告訴你可以直接從開發者工具復制 XPath,如下所示:
上述辦法復制出來的 XPath 表達式,冗余內容非常多,建議還是自己編寫完成。
下述內容為直接復制出的表達式。
/html/body/div[2]/div[5]
Python 正則表達式
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。