2013-07-21 3 views
6

Я использую Питона «повторно» модуль следующим образом:Модуль «re» Python не работает?

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

Все, что я делаю, получаю HTML из this site, и ищет для этого конкретного фрагмента кода:

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

Смежные вопросы