2012-03-30 26 views
6

Estoy tratando de analizar la lista de resultados de http://mobile.de.HTML analizando con BeautifulSoup 4 y Python

Primero lo probé con la clase HTMLParser, pero me salió un error: HTMLParser.HTMLParseError: EOF in middle of construct.

Así que lo probé con BeautifulSoup 4, que es mejor para sitios web no válidos, pero el <div> que estoy buscando no es accesible, y no puedo decir si es mi culpa o la del sitio web.

from bs4 import BeautifulSoup 
    import urllib 
    import socket 

    searchurl = "http://suchen.mobile.de/auto/search.html?scopeId=C&isSearchRequest=true&sortOption.sortBy=price.consumerGrossEuro" 
    f = urllib.urlopen(searchurl) 
    html = f.read() 
    soup = BeautifulSoup(html) 

    for link in soup.find_all("div","listEntry "): 
     print link 

listEntry es el <div> con el resultado de los coches. Pero parece que no está analizando <form id="parkAndCompareVehicle" name="parkAndCompareVehicle" action="">. No puedo encontrar la forma en el soupobject.

¿Dónde está la falla?

+1

¿Qué se obtiene si se intenta el siguiente bucle en su lugar? - 'para el enlace en soup.find_all (" form ", id =" parkAndCompareVehicle ")'? (Consulte http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#The%20basic%20find%20method:%20findAll(name,%20attrs,%20recursive,%20text,%20limit,%20* * kwargs)) –

+0

No obtengo nada. También probé con find_all ("formulario") y solo obtuve los otros 2. – user1010775

+0

hmm 'soup.find_all ('form', id = 'parkAndCompareVehicle')' devuelve el formulario para mí – gorlum0

Respuesta

2

Debería ser algo como:

for link in soup.findAll('div', {'class': 'listEntry '}): 
    print link 

Los atributos se especifican en un diccionario - findAll(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)

==========

UPD. Lo siento, parece que en bs4 puedes hacer eso también.

En cuanto a la falla, el formulario que está buscando no está en los resultados porque encierra listEntries tanto como puedo ver.

Qué hay de malo en que:

form = soup.find('form', id='parkAndCompareVehicle') 
print len(form.find_all('div', 'listEntry ')) 
+0

Eso es lo que falta - ver http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#The%20basic%20find%20method:%20findAll(name, % 20attrs,% 20recursive,% 20text,% 20limit,% 20 ** kwargs) –

+0

Parece (findALL) que quieres decir BeautifulSoup3, pero iam usa la Versión 4. Si uso find_all ('div', 'btn') obtengo el contenido del btn-div. Esa no es la culpa. ver [doku bs 4.0] (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all) – user1010775

+0

¿Cómo puedo hacerlo funcionar entonces? :/ – user1010775