2013-05-18 60 views
2

我想使用的功能re.findall(),它通過網頁搜索有一定的模式:re.findall在Python 3

from urllib.request import Request, urlopen 
import re 


url = Request('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1', headers={'User-Agent': 'Mozilla/20.0.1'}) 
webpage = urlopen(url).read() 

findrows = re.compile('<td class="cmeTableCenter">(.*)</td>') 
row_array = re.findall(findrows, webpage) #ERROR HERE 

我得到一個錯誤:

TypeError: can't use a string pattern on a bytes-like object 
+0

'row_array = findrows.findall(網頁)' – razpeitia

+0

我仍然得到同樣的errir – Josh

+0

的'webpage'變量不是'str',它具有鍵入'bytes',所以你需要先解碼它'webpage.decode('utf-8')' – treecoder

回答

5

urllib.request.urlopen返回bytes對象,而不是一個(統一)■特林。在嘗試匹配任何內容之前,您應該解碼它。例如,如果你知道你的網頁是UTF-8:

webpage = urlopen(url).read().decode('utf8') 

更好的HTTP庫會自動爲你做這個,但確定正確的編碼並不總是微不足道的,甚至是不可能,所以Python的標準庫沒有按「T。

另一種選擇是使用正則表達式bytes代替:

findrows = re.compile(b'<td class="cmeTableCenter">(.*)</td>') 

此,如果你不知道編碼要麼不介意與整個代碼bytes對象時是很有用的。

+0

如果我想從提供的網站複製標籤間信息 [rows of info。],這會工作嗎? findrows = re.compile('(。*?)') - >使用正則表達式 – Josh

2

您需要將字節解碼對象第一:

data = urlopen(url).read() 
webpage = data.decode('utf-8') #converts `bytes` to `str` 
findrows.findall(webpage) 
+0

謝謝,很高興看到一位印度同伴:) – Josh

0

替代你可以編譯一個字節的正則表達式:

re.compile(b"yourpatternhere")