2010-09-13 12 views
1

J'utilise Python et BeautifulSoup pour analyser les pages HTML. Malheureusement, pour certaines pages (> 400 Ko), BeatifulSoup tronque le contenu HTML.Beautifulsoup, Python et la page automatique HTML tronquée?

J'utilise le code suivant pour obtenir l'ensemble des "div" s:

findSet = SoupStrainer('div') 
set = BeautifulSoup(htmlSource, parseOnlyThese=findSet) 
for it in set: 
    print it 

À un certain moment, la sortie ressemble à:

correct string, correct string, incomplete/truncated string ("So, I")

bien, le htmlSource contient la chaîne "Alors, je m'ennuie", et bien d'autres. De plus, je voudrais mentionner que lorsque je fais un prettify() l'arborescence, je vois la source HTML tronquée.

Avez-vous une idée de comment résoudre ce problème?

Merci!

+0

hasard est que le html est malformé. Publiez le code HTML pertinent. – nosklo

+0

@nosklo: Plus de 400K? Peut-être une mauvaise idée. Afficher une preuve que la page n'est pas malformée serait plus agréable. Ou poster une preuve que l'application est en train de lire la page entière serait plus agréable. –

+0

BeautifulSoup essaye de gérer le balisage mal formé, mais oui, je suis sûr qu'il peut être vaincu finalement. Essayez d'exécuter le code source HTML via http://validator.w3.org et cela devrait identifier les bits invalides (il y en aura très probablement des tonnes) –

Répondre

4

Essayez d'utiliser lxml.html. C'est un analyseur html plus rapide et meilleur, et traite mieux avec le html cassé que le dernier BeautifulSoup. Cela fonctionne correctement pour votre page d'exemple, en analysant la page entière.

import lxml.html 

doc = lxml.html.parse('http://voinici.ceata.org/~sana/test.html') 
print len(doc.findall('//div')) 

Le code ci-dessus renvoie 131 divs.

+0

Merci pour votre réponse. –

0

J'ai trouvé une solution à ce problème en utilisant BeautifulSoup au beautifulsoup-where-are-you-putting-my-html, parce que je pense que c'est plus facile que lxml.

La seule chose que vous devez faire est d'installer:

pip install html5lib 

et l'ajouter en tant que paramètre à BeautifulSoup:

soup = BeautifulSoup(html, 'html5lib')