2013-07-15 12 views
6

Próbuję użyć BeautifulSoup, aby wyodrębnić zawartość ze strony internetowej (http://brooklynexposed.com/events/). Jako przykład problemu mogę uruchomić następujący kod:BeautifulSoup nie wyodrębnia wszystkich html (automatycznie usuwa znaczną część strony)

import urllib 
import bs4 as BeautifulSoup 

url = 'http://brooklynexposed.com/events/' 
html = urllib.urlopen(url).read() 

soup = BeautifulSoup.BeautifulSoup(html) 
print soup.prettify().encode('utf-8') 

Wyjście wydaje się odciąć html następująco:

 <li class="event"> 
     9:00pm - 11:00pm 
     <br/> 
     <a href="http://brooklynexposed.com/events/entry/5432/2013-07-16"> 
     Comedy Sh 
     </a> 
     </li> 
     </ul> 
    </div> 
    </div> 
    </div> 
    </div> 
</body> 
</html> 

Jest odcięcie listę z nazwą Comedy Show wzdłuż z całym html, który przychodzi po do końcowych tagów zamykających. Większość html jest automatycznie usuwana. Zauważyłem podobne rzeczy na wielu stronach internetowych, że jeśli strona jest zbyt długa, BeautifulSoup nie przeanalizuje całej strony i po prostu wycina tekst. Czy ktoś ma rozwiązanie tego? Jeśli BeautifulSoup nie jest w stanie obsłużyć takich stron, czy ktokolwiek zna inne biblioteki o funkcjach podobnych do prettify()?

+3

Twój kod działa dla mnie dobrze. Jeśli transfer sieci został przerwany w tym samym punkcie (więc załadowałeś tylko do "Comedy Sh"), to parser HTML "zamknie" wszystkie wciąż otwarte znaczniki i zobaczysz dokładnie, co masz. –

+1

Dla mnie cała zawartość jest dostępna. Zaczynając od kodu, aby utworzyć obiekt 'soup':' >>> len (unicode (zupa)) 'zwraca' 107578' Którą wersję BS używasz? Używam 4.2.0. –

+0

Ciekawe, używałem 4.2.1 z Pythonem 2.7. Jednak kiedy używam wersji 3.2, to wydaje się działać. Nie mógł to być problem z przekroczeniem limitu czasu, ponieważ jeśli wydrukowałem oryginalny plik HTML do pliku, pojawił się cały tekst. Jakieś inne pomysły dotyczące rozwiązania dla wersji 2.7? W przeciwnym razie czas rozpocząć przenoszenie kodu. – user2540231

Odpowiedz

0

To działa dobrze dla mnie, ale otrzymuję błąd, gdy mówię soup.prettify().encode('utf-8')

>>> from BeautifulSoup import BeautifulSoup as bs 
>>> 
>>> import urllib 
>>> url = 'http://brooklynexposed.com/events/' 
>>> html = urllib.urlopen(url).read() 
>>> 
>>> 
>>> soup = bs(html) 
>>> soup.prettify().encode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 8788: ordinal not in range(128) 
>>> 
>>> soup.prettify() 
'<!doctype html>\n<!--[if lt IE 7 ]&gt; 
&lt;html class="no-js ie6" lang="en"&gt; &lt;![endif]-->\n 
<!--[if IE 7 ]&gt; 
... 
... 
... 
... 
</body>\n</html>\n' 

. . . . Myślę, że to może pomóc: BeautifulSoup, where are you putting my HTML?

0

Miałem problemy, że bs4 tnie html na niektórych komputerach, a na niektórych nie. To nie był odtwarzalny ....

przeszedłem do tego:

soup = bs4.BeautifulSoup(html, 'html5lib') 

.. i teraz działa.

Powiązane problemy