2013-05-01 15 views
12

Sto cercando di analizzare una pagina web e ottenere alcune informazioni con BeautifulSoup.findAll ma non li fa trovare .. Sto usando python3Beautiful Soup findAll non trova tutti

il codice è questo

#!/usr/bin/python3 

from bs4 import BeautifulSoup 
from urllib.request import urlopen 

page = urlopen ("http://mangafox.me/directory/") 
# print (page.read()) 
soup = BeautifulSoup (page.read()) 

manga_img = soup.findAll ('a', {'class' : 'manga_img'}, limit=None) 

for manga in manga_img: 
    print (manga['href']) 

esso stampa solo la metà di loro ...

risposta

45

diverso parser HTML accordo diverso con rotta HTML. Quella pagina serve rotto HTML, e il parser lxml non sta trattando molto bene con esso:

>>> import requests 
>>> from bs4 import BeautifulSoup 
>>> r = requests.get('http://mangafox.me/directory/') 
>>> soup = BeautifulSoup(r.text, 'lxml') 
>>> len(soup.findAll('a', {'class' : 'manga_img'})) 
18 

La libreria standard html.parser ha meno problemi con questa pagina specifica:

>>> soup = BeautifulSoup(r.text, 'html.parser') 
>>> len(soup.findAll('a', {'class' : 'manga_img'})) 
44 

Tradurre che al tuo codice specifico esempio utilizzando urllib, si dovrebbe specificare il parser così:

soup = BeautifulSoup(page.read(), 'html.parser') 
+0

grazie! quello ha funzionato! :) – Clepto

+0

Wow. Questo mi ha salvato dal battere la testa di più sul tavolo. Come facevi a sapere che il parser lxml stava avendo problemi (a parte l'ovvio che stava solo restituendo 18 righe). cioè, come avrei dovuto sapere che si trattava di un problema diverso dal fatto che avesse silenziosamente il numero sbagliato di righe? – FuriousGeorge

+7

Esperienza; principalmente aiutando le persone qui su SO. –