Domanda

Ho due macchine ciascuna, per quanto ne so, con Python 2.5 e BeautifulSoup 3.1.0.1.

Sto cercando di grattare http://utahcritseries.com/RawResults.aspx , utilizzando :

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

Sul mio computer Windows ottengo il risultato corretto, che è un elenco di date e nomi di eventi. Sul mio mac, non lo so. invece, ottengo

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

Quello che sto notando è che quando

print row

sul mio computer Windows, i dati tr sembrano esattamente gli stessi del codice HTML di origine. Nota il tag di stile sulla seconda riga della tabella. Ecco le prime due righe:

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

Sul mio mac quando stampo le prime due righe, le informazioni sullo stile vengono rimosse dal tag tr e spostate in ciascun campo td. Non capisco perché questo stia accadendo. Non ricevo nessuno per ogni altro valore di data, perché BeautifulSoup sta mettendo un tag di carattere intorno a ogni altra data. Ecco l'output del 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>

Il mio script mostra il risultato corretto in Windows: cosa devo fare per far funzionare correttamente il mio Mac?

È stato utile?

Soluzione

Sospetto che il problema sia nella richiesta urlib2, non in BeautifulSoup:

Potrebbe essere utile se ci mostri la stessa sezione dei dati non elaborati restituita da questo comando su entrambe le macchine:

urllib2.urlopen(base_url)

Sembra che questa pagina possa aiutare: http://bytes.com/groups/python/635923- edificio browser-like-get-richiesta

La soluzione più semplice è probabilmente solo quella di rilevare l'ambiente in cui è in esecuzione lo script e modificare di conseguenza la logica di analisi.

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

Oppure fai in modo che Microsoft utilizzi gli standard web :)

Inoltre, non hai usato meccanizzare per recuperare le pagine? In tal caso, il problema potrebbe essere lì.

Altri suggerimenti

Esistono problemi documentati con la versione 3.1 di BeautifulSoup.

Potresti voler ricontrollare che è la versione che stai effettivamente utilizzando e, in tal caso, eseguire il downgrade.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top