如何使用Python和Beautiful Soup 条件性地获取数据
抱歉如果你觉得这个问题已经被问过了,但我看了相关的问题,作为一个Python新手,我还是找不到怎么用干净的方式写这个请求。
现在我有这段简单的Python代码:
from mechanize import Browser
from BeautifulSoup import BeautifulSoup
import re
import urllib2
br = Browser()
br.open("http://www.atpworldtour.com/Rankings/Singles.aspx")
filename = "rankings.html"
FILE = open(filename,"w")
html = br.response().read();
soup = BeautifulSoup(html);
links = soup.findAll('a', href=re.compile("Players"));
for link in links:
print link['href'];
FILE.writelines(html);
这段代码可以获取所有链接,其中的href包含“player”这个词。
现在我需要解析的HTML大概长这样:
<tr>
<td>1</td>
<td><a href="/Tennis/Players/Top-Players/Roger-Federer.aspx">Federer, Roger</a> (SUI)</td>
<td><a href="/Tennis/Players/Top-Players/Roger-Federer.aspx?t=rb">10,550</a></td>
<td>0</td>
<td><a href="/Tennis/Players/Top-Players/Roger-Federer.aspx?t=pa&m=s">19</a></td>
</tr>
这里的1表示玩家的排名。我想把这些数据放到一个字典里:
- 排名
- 玩家的名字
- 详细页面的链接(比如这里是/Tennis/Players/Top-Players/Roger-Federer.aspx)
你能给我一些建议吗?或者如果这很简单的话,帮我写这段代码?我不太确定怎么在Beautiful Soup里写这个请求。
安东尼
1 个回答
3
用你的方法查找玩家是可以的,但每个玩家会返回3个结果。其实直接查找表格会更简单,然后再逐行查看(除了表头):
table=soup.find('table', 'bioTableAlt')
for row in table.findAll('tr')[1:]:
cells = row.findAll('td')
#retreieve data from cells...
要获取你需要的数据:
rank = cells[0].string
player = cells[1].a.string
link = cells[1].a['href']