如何使用Python和Beautiful Soup有条件地获取一些数据

时间:2010-01-14 21:29:56

标签: python beautifulsoup

很抱歉,如果您觉得有人问这个问题,但我已经阅读了相关问题并且对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,&nbsp;Roger</a>&nbsp;(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 个答案:

答案 0 :(得分: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']