我正在使用Python的“re”模块,如下所示:
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 :(得分:9)
您要解析的HTML有多行。您需要将re.DOTALL
标记传递给findall
,如下所示:
print re.findall('<hgroup>(.*?)</hgroup>', request, re.DOTALL)
这允许.
匹配换行符,并返回正确的输出。
@jsalonen当然是正确的,用正则表达式解析HTML是一个棘手的问题。但是,在像这样的小案例中,特别是对于一次性剧本,我认为这是可以接受的。
答案 1 :(得分: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')