Web Scraper 高級用法——利用正則表達式篩選文本信息 | 簡易數據分析 17


這是簡易數據分析系列的第 17 篇文章。

學習了這么多課,我想大家已經發現了,web scraper 主要是用來爬取文本信息的。

在爬取的過程中,我們經常會遇到一個問題:網頁上的數據比較臟,我們只需要里面的一部分信息。比如說要抓取 電影的評價人數,網頁中抓到的原始數據是 1926853人評價,但是我們期望只抓取數字,把 人評價 這三個漢字丟掉。

這種類似的操作在 Excel 可以利用公式等工具處理,其實在 web scraper 里,也有一個利器,那就是正則表達式

正則表達式是一個非常強大工具,它主要是用來處理文本數據的,常用來匹配提取替換文本,在計算機程序中有非常廣泛的應用。

web scraper 中也內置了正則表達式工具,但只提供了提取的功能。雖然功能有所殘缺,對於 web scraper 使用者來說完全夠用了,畢竟 web scraper 的定位就是不會寫代碼的小白,我們只需要學習最基礎的知識就可以了。

1.正則表達式初嘗

我們先用 web scraper 初步嘗試一下正則表達式。這里還是用豆瓣電影做例子,我們先選擇電影的評價人數,預覽圖是這個樣子的:

Text 選擇器有個 Regex 的輸入框,這個就是輸入正則表達式的地方。我們輸入 [0-9],然后再點擊預覽,是這個樣子的:

這時候你應該就明白了, [0-9] 就是匹配一個數字的意思。如果我們要匹配多個數字呢?很簡單,后面再加個「 + 」號就好。把 [0-9]+ 輸入進去,預覽一下:

很明顯,所有的數字都匹配出來了。

2.正則表達式字符簇

上面講了用 [0-9] 匹配數字,我們想一下日常用到的文本信息,不外乎這幾種:數字、小寫字母、大些字母,漢字,特殊字符(比如說各種計量單位、下划線回車等符號) 。

正則表達式里都有匹配這些字符的方法,下面我用一個表格列舉出來:

字符簇 匹配
[0-9] 匹配所有的數字
[1-9] 匹配 1 到 9
[a-z] 匹配所有的小寫字母
[A-Z] 匹配所有的大寫字母
sky 匹配 sky 這個單詞,其余文本同理
天空 匹配 天空 這個詞,其余文本同理
[\u4e00-\u9fa5] 匹配所有的漢字(絕大部分情況下可以匹配成功)
[ \f\r\t\n] 匹配所有的空白字符

上面列舉了一些常用的,其實這些規則可以組合起來,比如說 [a-z][A-Z] 組合起來,就是 [a-zA-Z],表示匹配所有的字母。這些組合也有一些簡寫,我這里也列舉一些:

字符簇 匹配
\w 匹配字母、數字、下划線。等價於 [A-Za-z0-9_]
\W 匹配字母、數字、下划線
\s 匹配任何空白字符,包括空格、制表符、換頁符等等。等價於 [ \f\n\r\t\v]
\S 匹配任何空白字符

基本上掌握以上內容就能匹配絕大多數字符了,這里我推薦一個正則練習網站:

http://c.runoob.com/front-end/854

按照下圖所示就可以練習正則匹配了:

結合前面的例子,我們知道這些規則只能匹配一個字符,如何匹配多個字符?這就要學習正則表達式限定符

3.正則表達式限定符

我們已經知道在 [0-9] 后面加個加號「+」就可以匹配多個字符了,其實還有很多限定符,詳情可見下圖表格:

限定符 匹配解釋 原始數據 例子
{n} n 是一個非負整數。匹配確定的 n 次 100001 10{2},表示 0 這個字符匹配 2 次,匹配結果是 100
{n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次 100001 10{2,3},表示 0 這個字符最少匹配 2 次且最多匹配 3 次,匹配結果是 1000
{n,} n 是一個非負整數。至少匹配 n 次 100001 10{2,},表示 0 這個字符至少匹配 2 次,匹配結果是 10000
+ 匹配前面的子表達式一次或多次,等價於 {1,} z,zo,zoo zo+ 能匹配「zo」以及「zoo」,但不能匹配「z」
* 匹配前面的子表達式零次或多次,等價於 {0,} z,zo,zoo zo* 能匹配「z」、「zo」以及「zoo」
? 匹配前面的子表達式零次或一次,等價於 {0,1} z,zo,zoo zo? 能匹配「z」以及「zo」,但不能匹配「zoo」

4.實戰練習

學到這里,正則表達式可以算是入門了,我們可以上手幾個真實的例子練習一下:

1.提取價格標簽中的數字

假設 web scraper 爬到的文本信息是 價格:12.34 ¥,我們要把 12.34 提取出來。這個這個文本里有 5 類數據:

  • 漢字:價格
  • 標點符號:
  • 數字 1234
  • 小數點:.
  • 特殊字符:¥

首先我們匹配小數點前的數字 12,因為價格什么數字可以能出現,而且位數一般都大於 1 位,所以我們用 [0-9]+ 來匹配;考慮到小數點「.」在正則表達式里有特殊含義,我們需要小數點前面加反斜杠 \ 表示轉義,用 \. 匹配;小數部分同理,也用 [0-9]+ 匹配。

把這三部分組合在一起,即「[0-9]+\.[0-9]+」,這個表達式可以用一個圖來表示:

上面就是我們寫出的匹配正則,可以放在剛剛推薦的網站上驗證一下:

2.匹配日期

假設 web scraper 爬到的文本信息是 日期:2020-02-02[星期日],我們要把 2020-02-02[星期日] 提取出來。我們把這個文本分解一下:

  • 描述信息 日期: 不匹配,需要丟棄掉
  • 年,一般是 4 位,可以用 [0-9]{4} 匹配
  • 月,一般是 2 位,可以用 [0-9]{2} 匹配
  • 日,一般是 2 位,可以用 [0-9]{2} 匹配
  • 星期,多個漢字,可以用 [\u4e00-\u9fa5]+ 匹配
  • 分隔符 -,可以直接用「-」匹配
  • 分隔符 [],為了避免和正則表達式里的 [] 撞車,我們可以在前面加反斜杠 \ 表示轉義,用 \[ \] 匹配

把上面的分析結果綜合一下,就是

[0-9]{4}-[0-9]{2}-[0-9]{2}\[[\u4e00-\u9fa5]+\]

看上去還是挺復雜的,但是如果按上面的分析步驟一步一步來,你會發現匹配規則其實還是比較清晰的。

同樣我們可以用一張圖來表示上面的正則表達式:

5.進階學習

本篇教程只是正則的入門學習,很多知識點還沒有講到。如果你對此感興趣,可以去下面幾個網站學習:

1.菜鳥教程:正則表達式

繼續深入學習的一個網站,不過想成為高手,還得多加練習

2.正則表達式在線測試

可以測試自己寫的正則是否正確的一個網站,而且網頁末有常用的正則表達式,很多可以直接復制黏貼來用。

3.RegulexRegExr

可以可視化的顯示自己的正則匹配規則,教程中我就用了 regulex 生成正則匹配規則圖。

6.溫馨提示(踩坑預警)

我看了 web scraper 的源代碼,它的正則表達式支持不完全,目前只支持提取文字的功能:

他欠缺的功能有:

  • 全局匹配不支持
  • 忽略大小寫不支持
  • 不支持分組提取,默認返回第一個匹配值
  • 不支持文本替換

如果有以上的需求,可能要借助 Excel 等工具來支持。

7.聯系我

因為文章發在各大平台上,賬號較多不能及時回復評論和私信,有問題可關注公眾號 ——「鹵蛋實驗室」,(或 wx 搜索 egglabs)關注上車防失聯。

img


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM