2013-07-25 15 views
7

Próbuję pobrać tekst z dokumentów HTML za pomocą BeautifulSoup. W bardzo istotnym dla mnie przypadku wynik jest dziwny i interesujący: po pewnym czasie zupa jest pełna dodatkowych spacji w tekście (spacja oddziela każdą literę od następnej). Próbowałem przeszukać sieć, aby znaleźć powód, ale spotkałem się tylko z wiadomościami na temat przeciwnego błędu (bez spacji).BeautifulSoup zwraca nieoczekiwane dodatkowe spacje

Czy masz sugestie lub wskazówki, dlaczego tak się dzieje i jak rozwiązać ten problem ?.

Jest to bardzo prosty kod, który stworzył:

from bs4 import BeautifulSoup 

import urllib2 
html = urllib2.urlopen("http://www.beppegrillo.it") 
prova = html.read() 
soup = BeautifulSoup(prova) 
print soup 

I to jest linia podjęta na podstawie wyników, linia, gdzie ten problem zaczynają się pojawiać:

value = \” Giuseppe labbate oGM? nie vorremmo nuovi Uccelli chiamati lontre \ "> < wejście onmouseover = \" Tip (”< centralne terclass = \ \ '_ tytuł filmu \ \' > <b> G iuseppelabbateo g m? N O N v O r r e M O N U O V i U c c e l l i c h i a M a t i l O n t r e <

+2

Dlaczego drukujesz "ultrasoup"? Czy nie powinien to być "zupa"? – svineet

+0

Ten sam problem tutaj z innej strony internetowej. Nadal staram się dowiedzieć, czy jest to problem z BeautifulSoup czy leżącym u jego podstaw lxml. Oprogramowanie działa bez problemów w 32-bitowym Pythonie i kończy się niepowodzeniem z 64-bitową wersją. – Matthias

+0

Przepraszam za "ultrasoup", tylko mały błąd. Oczywiście właściwym kodem była "print soup" –

Odpowiedz

10

wierzę, jest to błąd lxml HTML strony parser. Spróbuj:

from bs4 import BeautifulSoup 

import urllib2 
html = urllib2.urlopen ("http://www.beppegrillo.it") 
prova = html.read() 
soup = BeautifulSoup(prova.replace('ISO-8859-1', 'utf-8')) 
print soup 

Co to jest obejście problemu. Uważam, że problem został rozwiązany w wersjach lxml 3.0 alpha 2 i lxml 2.3.6, więc warto sprawdzić, czy musisz uaktualnić do nowszej wersji.

Jeśli chcesz uzyskać więcej informacji na temat błędu został początkowo złożony tutaj:

https://bugs.launchpad.net/beautifulsoup/+bug/972466

Nadzieja to pomaga,

Hayden

+0

To działa idealnie, dziękuję.Czy mogę zapytać, co w tym przypadku zastępuje się? Kolejne pytanie: beautifulsoup zawsze przyjmuje parser html lxml? Jeśli nie, dlaczego go używam i jak mogę kontrolować, który parser adoptuję? Myślę, że mogą one wyglądać jak fałszywe pytania, ale jestem początkującym w parsowaniu html –

+0

@Hayden: Ugly, ale działającym rozwiązaniem. Dziękuję za to. – Matthias

4

Można określić parser jak html.parser:

soup = BeautifulSoup(prova, 'html.parser') 

Również można określić html5 parser:

soup = BeautifulSoup(prova, 'html5') 

nie zainstalowano jeszcze html5 parser? Zainstalować go z terminalu:

sudo apt-get install python-html5lib 

xml parser może być stosowany (soup = BeautifulSoup(prova, 'xml')), ale mogą pojawić się pewne różnice w multi-valued attributes jak class="foo bar".

Powiązane problemy