8

我正在使用 Python 的“re”模块,如下所示:

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>

但是,它继续打印一个空数组。为什么是这样?为什么 re.findall 找不到这个片段?

4

2 回答 2

10

您正在解析的 HTML 位于多行中。您需要将re.DOTALL标志传递给findall这样的:

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

这允许.匹配换行符,并返回正确的输出。

@jsalonen 是对的,当然,用正则表达式解析 HTML 是一个棘手的问题。但是,在像这样的小情况下,特别是对于一次性脚本,我会说这是可以接受的。

于 2013-07-21T20:41:31.033 回答
7

re模块没有损坏。您可能会遇到的事实是,并非所有 HTML 都不能轻松地与简单的正则表达式匹配。

相反,尝试使用像BeautifulSoup这样的实际 HTML 解析器来解析您的 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')
于 2013-07-21T20:41:01.010 回答