如何使用Python和Beautiful Soup 条件性地获取数据

1 投票
1 回答
2042 浏览
提问于 2025-04-15 18:03

抱歉如果你觉得这个问题已经被问过了,但我看了相关的问题,作为一个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 个回答

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']

撰写回答