【发布时间】:2013-12-28 17:00:25
【问题描述】:
我尝试从网页中抓取一些数据,一些行如下所示
<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。 我尝试在我的数据矩阵中获取“Mr. Google”这个名字以及数据作为一行。 (还有其他数据是来自同一网页的其他行) 似乎很难同时匹配所有这些。我能弄清楚的唯一方法是:
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} 吗? 也许重复可以解决它,但真的很难看。:( 我想知道是否有人可以帮助我摆脱这种重新模式。
另一种选择是使用不同的简单模式分别获取名称和数据。 问题是网页中还有其他一些单独的数据,所以我不想将这个“名称数据”行与单独的数据混合。我别无选择,只能一次性获取名称和数据,以便确保获得所需的正确数据。
谢谢。
【问题讨论】:
-
不要使用正则表达式解析 HTML,你只会发现麻烦。改为查看 HTML 解析库,例如 BeautifulSoup.
-
添加到 kroolik 的评论中,使用 BeautifulSoup 您可以使用类似单个 td 的方式获取列表本身中的名称数据。 td_tags = soup.find('tr').find_all('td'); info = [tag.text for tag in td_tags];更干净更简单