如何在python中找到所有重复模式并捕获子模式?

时间:2013-12-28 17:00:26

标签: python regex

我尝试从网页抓取一些数据,有些行就像下面的

<td><a href="some_web_site">Mr. Google</a></td>
<td>12.42%</td>
<td>1360</td>
<td><span style="color: #E3170D">49.12%</span></td>
<td><span style="color: #008000">2.513</span></td>
<td><span style="color: #E3170D">0.945</span></td>
<td>5.074</td>
<td>5.371</td>
<td>8.424</td>
</tr>

当然,每行末尾都有一个\ n。 我尝试将“谷歌先生”这个名称以及数据作为我数据矩阵中的一行。 (还有其他数据来自同一网页的其他行) 似乎很难同时匹配所有这些。我能弄清楚的唯一方法是:

pattern=re.complie(r'>([\w\s]*)</a></td>\n
                     (?:<td>([\d\.\%]*)</td>\n){2} 
                     (?:.*>([\d\.\%]*)</span></td>\n){3}
                     (?:<td>([\d\.]*)</td>\n){3}')

不幸的是,它只匹配最后一个,即“谷歌先生”,1360,0.945,8.424,但不是所有数据。我应该多次重复该模式而不是使用{2}或{3}吗? 也许重复可以解决它,但真的很丑。:( 我想知道是否有人可以帮助我摆脱这种模式。

另一个选择是使用不同的简单模式分别获取名称和数据。 问题是网页中还有一些其他单独的数据,因此我不想将这个“名称 - 数据”行与单独的数据混合在一起。我别无选择,只需要一次获取名称和数据,这样我就可以确保获得我想要的正确数据。

谢谢。

2 个答案:

答案 0 :(得分:1)

正则表达式正在寻找&gt;之间的任何可见字符(不是空格,而不是换行符)。和&lt;

data = re.findall('>\s*([^<\n\r]+)\s*<', html)
print data

这仅适用于您提供的示例字符串。

答案 1 :(得分:0)

更好地使用xpath:

import requests
import urllib2
from lxml import html
url = 'HTTP'

page = requests.get(url)
tree = html.fromstring(page.text)

a = tree.xpath('//td/a/text()|//td/text()')
b = tree.xpath('//td/span/text()')