我們能夠使用 urllib 向網頁請求并獲取其網頁數據。但是抓取信息數據量比較大,我們可能需要其中一小部分數據。對付剛才的難題,就需要正則表達式出馬了。正則表達式能幫助我們匹配過濾到我們需要的數據,但它學習起來非??菰餆o味。你可能會說,我還沒有開始想學習正則表達式,你就來打擊我? 莫慌!層層遞進地學習,一步一個腳印地學習,很快就會學會了。對于爬蟲,我覺得學會最基本的符號就差不多了。
1 正則表達式
下面是一張關于正則表達式字符的圖,圖片資料來自CSDN。先把圖中字符了解清楚,基本上算是入門。
2 re 模塊
Python 自1.5版本起通過新增 re (Regular Expression 正則表達式)模塊來提供對正則表達式的支持。使用 re 模塊先將正則表達式填充到 Pattern 對象中,再把 Pattern 對象作為參數使用 match 方法去匹配的字符串文本。match 方法會返回一個 Match 對象,再通過 Match 對象會得到我們的信息并進行操作。下面介紹幾個 re 常用的函數。
2.1 compile 函數
compile
是把正則表達式的模式和標識轉化成正則表達式對象,供 match() 和 search() 這兩個函數使用。它的函數語法如下:
re.compile(pattern[, flags])
- 第一個參數是
pattern
,指的正則表達式。 - 第二個參數
flags
是匹配模式,是個可選參數。可以使用按位或'|'表示同時生效,也可以在正則表達式字符串中指定。匹配模式有以下幾種:
flag | 描述 |
---|---|
re.I(全拼:IGNORECASE) | 忽略大小寫(括號內是完整寫法,下同) |
re.M(全拼:MULTILINE) | 多行模式,改變'^'和'$'的行為(參見上圖) |
re.S(全拼:DOTALL) | 點任意匹配模式,改變'.'的行為 |
re.L(全拼:LOCALE) | 使預定字符類 \w \W \b \B \s \S 取決于當前區域設定 |
re.U(全拼:UNICODE) | 使預定字符類 \w \W \b \B \s \S \d \D 取決于unicode定義的字符屬性 |
re.X(全拼:VERBOSE) | 詳細模式。這個模式下正則表達式可以是多行,忽略空白字符,并可以加入注釋。 |
- 該方法返回的結果是一個 Pattern 對象。
2.2 match 函數
match()
函數只在字符串的開始位置嘗試匹配正則表達式,也就是說只有在 0 位置匹配成功的話才有返回。如果不是開始位置匹配成功的話,match() 就返回 none。它的函數語法如下:
re.match(pattern, string[, flags])
- 第一個參數:匹配的正則表達式
- 第二個參數:要被匹配的字符串
- flags 是可選參數,跟 compile 用法相似
- 匹配成功 re.match 方法返回一個匹配的對象,否則返回None。要想獲得匹配結果,既可以使用
groups()
函數獲取一個包含所有字符串的元組(從 1 到 所含的小組號),也可以使用group(組號)
函數獲取某個組號的字符串。
match
函數用法的示例代碼:
import re
pattern = re.compile('Python')
text = 'Python python pythonn'
match = re.search(pattern, text)
if match:
print(match.group())
else:
print('沒有匹配')
2.3 search 函數
search()
函數是掃描整個字符串來查找匹配,它返回結果是第一個成功匹配的字符串。
re.search(pattern, string[, flags])
參數用法以及返回結果跟match
函數用法相同。
search
函數用法的示例代碼:
import re
pattern = re.compile('Python')
text = 'welcome to Python world!'
match = re.search(pattern, text)
if match:
print(match.group())
else:
print('沒有匹配')
2.4 findall 函數
findall
函數在字符串中搜索子串,并以列表形式返回全部能匹配的所有子串。
re.findall(pattern, string[, flags])
參數用法以及返回結果跟match
函數用法相同。
findall
函數用法的示例代碼:
import re
pattern = re.compile('\d+')
text = 'one1two2three3four4'
list = re.findall(pattern, text)
if list:
print(list)
else:
print('沒有匹配')
上篇文章:詳解 python3 urllib
推薦閱讀:學爬蟲之道