跟我學爬蟲-2-使用正則表達式解析文本


  上節簡單演示了如何獲取一個網頁的源代碼,本節繼續,稍微提升一下我們的水平,網頁的源代碼中通常包含了大量無用的東西,如果你了解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方法獲取匹配到的內容

好了,本節就到這里,舉的例子很簡單,不過你可以找一些復雜的網頁練練手,熟悉一下正則表達式的用法,以后肯定還會有很多地方會用到正則表達式的


免責聲明!

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



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