Модуль "re" Python не работает?
Я использую модуль "re" Python следующим образом:
request = get("http://www.allmusic.com/album/warning-mw0000106792")
print re.findall('<hgroup>(.*?)</hgroup>', request)
все, что я делаю, это получение 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>
однако он продолжает печатать пустой массив. Почему так? Почему не может.findAll найти этот фрагмент?
2 ответов
HTML, который вы анализируете, находится на нескольких строках. Вам нужно пройти re.DOTALL
флаг findall
такой:
print re.findall('<hgroup>(.*?)</hgroup>', request, re.DOTALL)
в данном .
для соответствия новым строкам и возвращает правильный вывод.
@jsalonen прав, конечно, что разбор HTML с регулярным выражением-сложная проблема. Однако в небольших случаях, подобных этому, особенно для одноразового сценария, я бы сказал, что это приемлемо.
re
модуль не нарушена. Скорее всего, вы столкнетесь с тем фактом, что не все HTML не могут быть легко сопоставлены с простыми регулярными выражениями.
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')