Вопрос

Насколько мне известно, у меня есть по две машины, каждая из которых работает под управлением 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

Что я замечаю, так это то, что когда я

print row

на моем компьютере с Windows данные 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, когда я печатаю первые две строки, информация о стиле удаляется из тега tr и перемещается в каждое поле td.Я не понимаю, почему это происходит.Я не получаю ничего для любого другого значения даты, потому что BeautifulSoup помещает тег шрифта вокруг каждой другой даты.Вот выходные данные 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 работать правильно?

Это было полезно?

Решение

Я подозреваю, что проблема в запросе 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')

Или заставить Microsoft использовать веб-стандарты :)

Кроме того, разве вы не использовали mechanize для извлечения страниц?Если это так, то проблема может быть именно в этом.

Другие советы

Есть такие документированные проблемы с версией 3.1 BeautifulSoup.

Возможно, вам захочется дважды проверить, какую версию вы на самом деле используете, и, если это так, понизить версию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top