2014-05-09 27 views
0

我想通過使用python閱讀html文檔並將所有表格行收集到單個列表中。 (我知道的用於此目的的專用工具,但我必須使用正則表達式。) 這是我到目前爲止的代碼:在Python中使用正則表達式的html標籤

import urllib 
import re 
URL = 'http://www.xpn.org/events/concert-calendar' 
sock = urllib.urlopen(URL) 
doc = sock.read() 
sock.close() 
patString = r''' 
    < tr(. * ?)> 
    (.*?) 
    < /tr> 
    ''' 
pattern = re.compile(patString, re.VERBOSE) 
concerts = re.findall(pattern, doc) 
print (concerts) 

但是,打印只打印一個空列表。我嘗試了一些不同的模式,但都產生了相同的結果。我很確定這個問題是模式,但我不完全確定(因爲我正試圖在寫這篇文章的時候使用python)。我試圖找到的表格行格式爲<tr class="odd/even"> other data </tr>,我想捕獲所有這些數據並將其放置到列表中供稍後在腳本中使用。

任何幫助表示讚賞。 謝謝

+5

'我必須使用regex.'真的嗎?我也很好奇,爲什麼? – njzk2

+0

'。 *「從字面上解析任何角色,然後是無限的空間,然後可能還有一個空間。這就是你打算輸入的內容嗎? –

+1

數據換行符?嘗試'pattern = re.compile(patString,re.VERBOSE | re.DOTALL)'。 –

回答

3

這符合您的示例數據就好。如果數據在多行上運行,請打開.的選項以匹配\n。順便說一句,這個選項是re.DOTALL

<tr(.*?)>(.*?)</tr> 

?資格中間的數據是非常重要的,否則它會匹配整個<tr></tr>塊的數據部分。

這很容易,因爲你不解析HTML,而只是試圖在一個特定的情況下提取一些標籤。

例如,如果您在<tr>中有<tr>,事情會變得很難看。

+0

我正在考慮re.MULTILINE,但re.DOTALL在這種情況下更好 – njzk2

+0

這很好。謝謝您的幫助。接受這個答案。 –

+0

另外值得注意的是,我使用了] *?)>作爲第一個標籤。 –