2012-12-19 46 views
1

我正在寻找HTML页面内部的重复模式。
我的前缀“<H2>四季</H2 >”后,有意启动的模式
相同的模式前缀之前发生过,我不感兴趣的那些。如何在存在前缀时查找所有匹配项

我试图(和失败的)用下面的Python代码(I简化了图案为 '< A HREF = + < /一个>。?' 用于制备这个问题可读的缘故):

matches = re.compile('<h2>Seasons</h2>.+?(<a href=.+?</a>)+',re.DOTALL).findall(page) 
for ref in matches 
    print ref 

鉴于页:

blah blah html stuff 
<h2>Seasons</h2> 
blah blah more html stuff 
<a href=http://www.111.com>111</a><a href=http://www.222.com>222</a><a href=http://www.333.com>333</a> 

输出是

<a href=http://www.333.com>333</a> 

所以它只打印最后一个匹配,另外两个不打印到findall列表。 我该如何做遍历组的所有匹配?

+0

这可能是问题:http://www.regular-expressions.info/captureall.html – Cameron

+0

为什么你想用的时候有许多伟大的HTML解析器将做的工作正则表达式解析HTML更好,更容易? –

回答

2

问题是,正则表达式只匹配一次。括号内的组匹配多次,但整个正则表达式只匹配一次。这意味着只有一个匹配被返回,最后一个匹配。

为了解决这个问题,你需要编写一个匹配多次的正则表达式。你可能会认为使用向后断言为<h2>元素,像这样:

(?<=<h2>Seasons</h2>.+?)(<a href=.+?</a>) # doesn't work 

这是说找<a>元素,但只有当它们被<h2>Seasons</h2>之前。不幸的是,后视字符串必须是固定长度的。您不能将.+?置于后视断言中。所以这种方法已经结束了。

接下来是先找到<h2>元素的位置,然后从那里开始执行正则表达式搜索。

>>> re.findall('<a href=.+?</a>', page[page.find('<h2>Seasons</h2>'):], re.DOTALL) 
['<a href=http://www.111.com>111</a>', '<a href=http://www.222.com>222</a>', '<a href=http://www.333.com>333</a>'] 
1

你应该使用一个html解析器,如BeautifulSoup;会让你的生活变得更轻松。

+0

我认为HTML解析器对于我所要做的事情太多了 – ilomambo

相关问题