Модуль "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 не могут быть легко сопоставлены с простыми регулярными выражениями.

, попробовать парсинг 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')