2013-07-21 15 views
6

Ich verwende Python-Modul "re" wie folgt:Pythons "Re" Modul funktioniert nicht?

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

Alles, was ich tue, ist das HTML this site bekommen, und für diesen speziellen Code-Snippet suchen:

<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> 

jedoch Es wird weiterhin ein leeres Array gedruckt. Warum ist das? Warum kann dieses Snippet nicht gefunden werden?

+0

Was ist '

'? Was sollte das zusammenbringen? – Joe

Antwort

9

Die HTML Sie ist auf mehreren Linien parsen. Sie müssen die re.DOTALL Flagge findall wie dies passieren:

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

Dies ermöglicht . Zeilenumbrüche übereinstimmen, und gibt den richtigen Ausgang.

@jsalonen ist natürlich richtig, dass das Parsen von HTML mit Regex ein kniffliges Problem ist. In kleinen Fällen wie diesem, vor allem für ein einmaliges Skript, würde ich sagen, dass es akzeptabel ist.

+1

Ernsthaft Jungs. Regexps für HTML? Es kann ein- oder zweimal funktionieren, aber am Ende müssen Sie scheitern: Reguläre Ausdrücke sind für normale Sprachen, was HTML nicht ist. – jsalonen

+0

@jsalonen, für Teilmenge von HTML ist es in Ordnung. Siehe zum Beispiel die zweite Antwort, die Sie verlinkt haben – RiaD

+1

Manchmal mag es funktionieren, aber es ist wirklich sehr schlecht Ingenieurskunst. Es ist ebenso einfach, einen tatsächlichen HTML-Parser zu verwenden. Warum also nicht? – jsalonen

6

re Modul ist nicht defekt. Was Ihnen wahrscheinlich begegnet, ist die Tatsache, dass nicht jedes HTML mit einfachen Regexs einfach zu vergleichen ist.

Stattdessen versuchen Sie Ihre HTML mit einem tatsächlichen HTML-Parser wie BeautifulSoup Parsen:

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') 

oder alternativ mit pyquery:

from pyquery import PyQuery as pq 

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

Aus irgendeinem Grund erinnerte ich mich an 'BeautifulSoup', das erheblich mehr Mühe als das nahm. Es war wahrscheinlich nur meine Unerfahrenheit, es zu dieser Zeit zu benutzen. Ich bin überrascht, wie einfach diese Lösung ist. +1 –

Verwandte Themen