python- beautifulsoup 误报我的 HTML 吗?

2 投票
2 回答
661 浏览
提问于 2025-04-15 11:20

我有两台机器,尽我所知,它们分别运行的是Python 2.5和BeautifulSoup 3.1.0.1。

我正在尝试从这个网站抓取数据:http://utahcritseries.com/RawResults.aspx,使用的是:

from BeautifulSoup import BeautifulSoup
import urllib2

base_url = "http://www.utahcritseries.com/RawResults.aspx"

data=urllib2.urlopen(base_url)
soup=BeautifulSoup(data)
i = 0
table=soup.find("table",id='ctl00_ContentPlaceHolder1_gridEvents')
#table=soup.table
print "begin table"
for row in table.findAll('tr')[1:10]:
    i=i + 1
    col = row.findAll('td')
    date = col[0].string
    event = col[1].a.string
    confirmed = col[2].string
    print '%s - %s' % (date, event)
print "end table"
print "%s rows processed" % i

在我的Windows机器上,我得到了正确的结果,也就是一系列的日期和事件名称。但在我的Mac上,我却没有得到这些结果。相反,我得到了

3/2/2002 - Rocky Mtn Raceway Criterium
None - Rocky Mtn Raceway Criterium
3/23/2002 - Rocky Mtn Raceway Criterium
None - Rocky Mtn Raceway Criterium
4/2/2002 - Rocky Mtn Raceway Criterium
None - Saltair Time Trial
4/9/2002 - Rocky Mtn Raceway Criterium
None - DMV Criterium
4/16/2002 - Rocky Mtn Raceway Criterium

我注意到,当我在我的Windows机器上

print row

时,tr标签的数据和源HTML完全一样。注意第二行表格中的style标签。这是前两行的内容:

<tr>
<td>
 3/2/2002
</td>
<td>
 <a href="Event.aspx?id=226">
  Rocky Mtn Raceway Criterium
 </a>
</td>
<td>
 Confirmed
</td>
<td>
 <a href="Event.aspx?id=226">
  Points
 </a>
</td>
<td>
 <a disabled="disabled">
  Results
 </a>
</td>
</tr>

<tr style="color:#333333;background-color:#EFEFEF;">
<td>
 3/16/2002
</td>
<td>
 <a href="Event.aspx?id=227">
  Rocky Mtn Raceway Criterium
 </a>
</td>
<td>
 Confirmed
</td>
<td>
 <a href="Event.aspx?id=227">
  Points
 </a>
</td>
<td>
 <a disabled="disabled">
  Results
 </a>
</td>
</tr>

在我的Mac上,当我打印前两行时,style信息从tr标签中消失了,转而放到了每个td字段里。我不明白为什么会这样。我在每个其他日期值上都得到了None,因为BeautifulSoup在每个其他日期周围加了一个font标签。这是Mac上的输出:

<tr>
<td>
 3/2/2002
</td>
<td>
 <a href="Event.aspx?id=226">
  Rocky Mtn Raceway Criterium
 </a>
</td>
<td>
 Confirmed
</td>
<td>
 <a href="Event.aspx?id=226">
  Points
 </a>
</td>
<td>
 <a disabled="disabled">
  Results
 </a>
</td>
</tr>

<tr bgcolor="#EFEFEF">
<td>
 <font color="#333333">
  3/16/2002
 </font>
</td>
<td>
 <font color="#333333">
  <a href="Event.aspx?id=227">
   Rocky Mtn Raceway Criterium
  </a>
 </font>
</td>
<td>
 <font color="#333333">
  Confirmed
 </font>
</td>
<td>
 <font color="#333333">
  <a href="Event.aspx?id=227">
   Points
  </a>
 </font>
</td>
<td>
 <font color="#333333">
  <a disabled="disabled">
   Results
  </a>
 </font>
</td>
</tr>

我的脚本在Windows上显示了正确的结果——我需要做些什么才能让我的Mac正常工作呢?

2 个回答

2

BeautifulSoup 3.1 版本有一些已知的问题

你可能需要确认一下自己到底在用哪个版本,如果真的是这个版本的话,建议你降级到之前的版本。

1

我觉得问题出在urlib2请求上,而不是BeautifulSoup:

如果你能把两个机器上用这个命令返回的原始数据的同一部分给我们看看,可能会有帮助:

urllib2.urlopen(base_url)

这个页面看起来可能会有帮助:

http://bytes.com/groups/python/635923-building-browser-like-get-request

最简单的解决办法可能就是检测一下脚本运行的环境,然后相应地调整解析逻辑。

>>> import os
>>> os.uname() 
('Darwin', 'skom.local', '9.6.0', 'Darwin Kernel Version 9.6.0: Mon Nov 24 17:37:00 PST 2008; root:xnu-1228.9.59~1/RELEASE_I386', 'i386')

或者让微软遵循网络标准 :)

另外,你不是用mechanize来获取页面吗?如果是的话,问题可能出在那里。

撰写回答