2013-07-21 34 views
6

我使用Python的如下“再”模块:Python的“重新”模块不工作?

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

我做的越来越的this site的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> 

然而它继续打印一个空数组。为什么是这样?为什么不能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 –