2013-07-21 7 views
6

Używam Pythona "re" moduł następująco:Moduł "re" Pythona nie działa?

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

Wszystko robię jest coraz kod HTML this site, i patrząc na tym konkretnym fragmencie kodu:

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

jednak , kontynuuje drukowanie pustej tablicy. Dlaczego to? Dlaczego re.findall nie może znaleźć tego fragmentu? Moduł

+0

Co z '

'? Co to powinno pasować? – Joe

Odpowiedz

9

HTML jesteś parsowania jest na wielu liniach. Trzeba zdać flagę re.DOTALL do findall tak:

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

Pozwala . dopasować nowe linie i zwraca poprawny wynik.

@jsalonen ma oczywiście rację, że parsowanie HTML z regex jest trudnym problemem. Jednak w małych przypadkach takich jak ten, szczególnie w przypadku jednorazowego scenariusza, powiedziałbym, że jest to dopuszczalne.

+1

Poważnie chłopaki. Regexps dla HTML? Może działać raz lub dwa razy, ale ostatecznie kończy się niepowodzeniem: wyrażenia regularne są dla zwykłych języków, których HTML nie jest. – jsalonen

+0

@jsalonen, dla podzbioru html jest w porządku. Zobacz na przykład drugą odpowiedź, którą podłączyłeś – RiaD

+1

Czasami to może zadziałać, ale jest to naprawdę bardzo zła praktyka inżynierska. Równie proste jest użycie rzeczywistego parsera HTML. Dlaczego więc tego nie robić? – jsalonen

6

re nie jest uszkodzony. Prawdopodobnie napotkasz na tym, że nie wszystkie HTML można łatwo dopasować do prostych wyrażeń regularnych.

Zamiast tego, spróbuj parsowania kodu HTML z rzeczywistym parser HTML jak 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') 

lub alternatywnie z pyquery:

from pyquery import PyQuery as pq 

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

Z jakiegoś powodu zapamiętałem "BeautifulSoup", biorąc znacznie więcej wysiłku niż to. Prawdopodobnie był to tylko mój brak doświadczenia w używaniu go w tym czasie. Jestem zaskoczony, jak łatwe jest to rozwiązanie. +1 –

Powiązane problemy