2012-03-30 8 views
6

Próbuję przeanalizować listę wyników http://mobile.de.Parsowanie HTML za pomocą BeautifulSoup 4 i Python

Najpierw próbowałem go z klasą HTMLParser, ale otrzymałem komunikat o błędzie: HTMLParser.HTMLParseError: EOF in middle of construct.

Wypróbowałem to z BeautifulSoup 4, który jest lepszy dla nieważnych stron internetowych, ale <div> szukam jest niedostępny i nie mogę stwierdzić, czy to moja wina, czy strona internetowa.

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 jest <div> z wynikiem samochodów. Ale wygląda na to, że nie parsuje <form id="parkAndCompareVehicle" name="parkAndCompareVehicle" action="">. Nie mogę znaleźć formy w zupie.

Gdzie jest wina?

+1

Co otrzymasz, jeśli spróbować następujących pętli zamiast? - 'dla łącza w zupie.find_all (" form ", id =" parkAndCompareVehicle ")'? (Zobacz http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#The%20basic%20find%20method:%20findAll(name,%20attrs,%20recursive,%20text,%20limit,%20* * kwargs)) –

+0

Nic nie dostaję. Próbowałem również z find_all ("formularz") i mam tylko 2 inne. – user1010775

+0

hmm 'zupa.find_all ('formularz', id = 'parkAndCompareVehicle')' zwraca formularz dla mnie – gorlum0

Odpowiedz

2

To powinno być coś takiego:

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

Atrybuty są określone w słowniku - findAll(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)

==========

UPD. Niestety wydaje się, że w bs4 możesz to zrobić w ten sam sposób.

Jeśli chodzi o usterkę, formularz, którego szukasz, nie znajduje się w wynikach, ponieważ obejmuje listę listEntries, o ile widzę.

Co w tym złego, że:

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

To wszystko - zobacz http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#The%20basic%20find%20method:%20findAll(name, % 20attrs,% 20recursive,% 20text,% 20limit,% 20 ** kwargs) –

+0

Wygląda (findALL), że masz na myśli BeautifulSoup3, ale ja używasz wersji 4. Jeśli użyję find_all ("div", "btn"), otrzymam zawartość btn-div. To nie wina. zobacz [doku bs 4.0] (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all) – user1010775

+0

Jak mogę to sprawić? :/ – user1010775

Powiązane problemy