上節簡單演示了如何獲取一個網頁的源代碼,本節繼續,稍微提升一下我們的水平,網頁的源代碼中通常包含了大量無用的東西,如果你了解html相關知識的話,就會知道網頁源代碼中還有大量的標簽、css代碼、js代碼,而這些對我們來說,一般都是不需要的,因此,當我們把網頁源代碼拿到手之后,還需要對它進行一定的處理,從中提取出我們需要的信息。提取的方法有很多,而今天說的方法是利用正則表達式來提取信息,關於正則表達式,詳細用法可參見Python正則表達式指南。
正則表達式是對字符串進行操作的一種邏輯公式,利用事先定義好的一些特定字符、以及這些特定字符的組合,組成一個"規則字符串",這個規則字符串可以用來實現對待操作字符串的定位,選取等操作。
在python中使用正則表達式需要用到python的標准庫中一個模塊re
>>> import re
簡單列一些下面會用到的正則表達式的特殊字符
- [] 字符集,中括號內可以包含任意數量的字符串,然后這個整體可以匹配其中任意一個字符,例如[abc]可以匹配a,b,c中任意一個字符一次
- [0-9] 匹配一個0-9的數字,0-9是0123456789的簡寫, 正則表達式支持這樣的寫法
- + 匹配前一個字符1到多次
- . 匹配任意字符,除了換行
- () 括號代表分組,可以將正則表達式分為幾個小部分
- \ 轉義,使后一個字符改變原來的意思,主要用來使特殊字符匹配其自身
不多說,先上代碼
>>> import requests
>>> url = 'http://httpbin.org/ip'
>>> response = requests.get(url)
>>> print response.content
{
"origin": "123.114.37.67"
}
>>>
上面的代碼和昨天差不多,不過打印出了下載到網頁的源代碼,可以看到,源代碼中有一個ip地址,下面我們嘗試使用正則獲取到這個ip地址
首先分析一下ip地址的格式,1-3個數字然后是.然后是1-3個數字,這樣的重復,那么可以這么寫
[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
分析一下:
[0-9]代表匹配任意一個數字, +代表前面字符可以重復1到多次,因此[0-9]+可以匹配1到多個數字,當然也能匹配1-3個數字
\代表轉移, .代表匹配任意字符, \.代表去除.的特殊含義,使得.僅能匹配其自身
>>> content = response.content
>>> match_obj = re.search("[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+", content)
>>> match_obj
<_sre.SRE_Match object at 0x0000000002E37370>
>>> dir(match_obj)
['__class__', '__copy__', '__deepcopy__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string']
>>> match_obj.group()
'123.114.37.67'
上面的代碼中使用了re.search方法將正則表達式作用於獲取的網頁源代碼上,然后再從返回值的group方法中獲取正則表達式匹配到的文本
簡單介紹一下re.search方法
search(pattern, string, flags=0)
Scan through string looking for a match to the pattern, returning
a match object, or None if no match was found.
re.search方法接受三個參數,第三個先不說,pattern即為一個正則表達式, string即待操作字符串,然后返回值為一個match object,這個對象的方法在上面的代碼中我們也可以看到,可以利用group方法獲取匹配到的內容
好了,本節就到這里,舉的例子很簡單,不過你可以找一些復雜的網頁練練手,熟悉一下正則表達式的用法,以后肯定還會有很多地方會用到正則表達式的
