Pregunta

Tengo dos máquinas cada una, que yo sepa, ejecutando python 2.5 y BeautifulSoup 3.1.0.1.

Estoy tratando de raspar http://utahcritseries.com/RawResults.aspx , usando :

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

En mi máquina Windows, obtengo el resultado correcto, que es una lista de fechas y nombres de eventos. En mi Mac, no lo hago. en cambio, obtengo

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

Lo que estoy notando es que cuando

print row

en mi máquina Windows, los datos tr se ven exactamente igual que el código fuente html. Tenga en cuenta la etiqueta de estilo en la segunda fila de la tabla. Aquí están las dos primeras filas:

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

En mi Mac cuando imprimo las dos primeras filas, la información de estilo se elimina de la etiqueta tr y se mueve a cada campo td. No entiendo por qué está sucediendo esto. Obtengo None para cada otro valor de fecha, porque BeautifulSoup está poniendo una etiqueta de fuente alrededor de cada otra fecha. Aquí está la salida 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>

Mi script muestra el resultado correcto en Windows: ¿qué debo hacer para que mi Mac funcione correctamente?

¿Fue útil?

Solución

Sospecho que el problema está en la solicitud urlib2, no en BeautifulSoup:

Puede ser útil que nos muestre la misma sección de datos sin procesar que devuelve este comando en ambas máquinas:

urllib2.urlopen(base_url)

Parece que esta página podría ayudar: http://bytes.com/groups/python/635923- building-browser-like-get-request

La solución más simple probablemente sea simplemente detectar en qué entorno se está ejecutando el script y cambiar la lógica de análisis en consecuencia.

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

O haga que Microsoft use estándares web :)

Además, ¿no usaste mecanizar para buscar las páginas? Si es así, el problema puede estar ahí.

Otros consejos

Hay problemas documentados con la versión 3.1 de BeautifulSoup.

Es posible que desee verificar dos veces cuál es la versión que está utilizando y, si es así, bajar de categoría.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top