2013-07-21 42 views
6

我使用Python的如下「再」模塊:Python的「重新」模塊不工作?

request = get("http://www.allmusic.com/album/warning-mw0000106792") 
print re.findall('<hgroup>(.*?)</hgroup>', request) 

我做的越來越的this site的HTML,並尋找這個代碼特定摘錄:

<hgroup> 
    <h3 class="album-artist"> 
     <a href="http://www.allmusic.com/artist/green-day-mn0000154544">Green Day</a>  </h3> 

    <h2 class="album-title"> 
     Warning  </h2> 
</hgroup> 

然而它繼續打印一個空數組。爲什麼是這樣?爲什麼不能re.findall找到這個片段?

+0

'

''?該匹配什麼? – Joe

回答

9

您解析HTML是多條線路上。您需要將re.DOTALL標誌傳遞給findall這樣的:

print re.findall('<hgroup>(.*?)</hgroup>', request, re.DOTALL) 

這使得.匹配換行,並返回正確的輸出。

@jsalonen是正確的,當然,用正則表達式解析HTML是一個棘手的問題。但是,在這種小型案例中,特別是對於一次性腳本,我會說這是可以接受的。

+1

認真的傢伙。 HTML的正則表達式?它可能會工作一次或兩次,但最終肯定會失敗:正則表達式適用於常規語言,而HTML則不適用。 – jsalonen

+0

@jsalonen,爲html的子集很好。例如,看看你連接的第二個答案 – RiaD

+1

有時候它可能有用,但它的工程實踐非常糟糕。而且,使用實際的HTML解析器也很簡單。那麼爲什麼不這樣做呢? – jsalonen

6

re模塊沒有壞掉。你可能遇到的事實是,並非所有的HTML都不能與簡單的正則表達式輕鬆匹配。

相反,嘗試與實際HTML解析器解析您的HTML像BeautifulSoup

from BeautifulSoup import BeautifulSoup 
from requests import get 

request = get("http://www.allmusic.com/album/warning-mw0000106792") 
soup = BeautifulSoup(request.content) 
print soup.findAll('hgroup') 

或者,用pyquery

from pyquery import PyQuery as pq 

d = pq(url='http://www.allmusic.com/album/warning-mw0000106792') 
print d('hgroup') 
+2

出於某種原因,我記得'BeautifulSoup'花費了比這更多的努力。這可能只是我當時使用它的經驗不足。我很驚訝這個解決方案有多簡單。 +1 –