2013-07-15 7 views
6

Ich versuche BeautifulSoup zu verwenden, um den Inhalt von einer Website zu extrahieren (http://brooklynexposed.com/events/). Als ein Beispiel für das Problem, das ich den folgenden Code ausführen kann:BeautifulSoup nicht extrahieren alle HTML (automatisch löschen viel von einer Seite html)

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') 

Der Ausgang der html abzuschneiden scheint wie folgt:

 <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> 

Es wird die Liste mit den Namen Comedy Show abschneidet entlang mit allen html, die bis zum finalen schließenden tag kommen. Die Mehrheit des HTML wird automatisch entfernt. Ich habe ähnliche Dinge auf zahlreichen Webseiten bemerkt, dass, wenn die Seite zu lang ist, BeautifulSoup die gesamte Seite nicht analysiert und nur Text ausschneidet. Hat jemand eine Lösung dafür? Wenn BeautifulSoup nicht in der Lage ist, solche Seiten zu bearbeiten, kennt jemand andere Bibliotheken mit ähnlichen Funktionen wie prettify()?

+3

Ihr Code funktioniert für mich ganz gut. Wenn der Netzwerktransfer an genau diesem Punkt unterbrochen wurde (also wurde nur bis "Comedy Sh" geladen), dann wird der HTML-Parser alle noch offenen Tags "schließen" und Sie sehen genau, was Sie bekommen haben. –

+1

Für mich ist der gesamte Inhalt da. Beginnen Sie mit Ihrem Code, um das 'suppen'-Objekt zu erzeugen:' '> len (Unicode (Suppe)) 'gibt' 107578' zurück Welche Version von BS verwenden Sie? Ich benutze 4.2.0. –

+0

Interessant, ich habe 4.2.1 mit Python 2.7 verwendet. Wenn ich 3,2 benutze, scheint es zu funktionieren. Es konnte kein Timeout-Problem sein, denn wenn ich den ursprünglichen HTML-Code in eine Datei druckte, erschien der gesamte Text. Irgendwelche anderen Ideen für eine Lösung für 2.7? Sonst ist es an der Zeit, meinen Code zu portieren. – user2540231

Antwort

0

Es funktioniert gut für mich, aber ich Fehler, wenn ich 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' 

sagen. . . . Ich denke, das kann Ihnen helfen: BeautifulSoup, where are you putting my HTML?

0

Ich hatte Probleme, dass BS4 schneidet HTML auf einigen Maschinen und auf einige nicht. Es war nicht reproduzierbar ....

ich dazu geschaltet:

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

.. und es funktioniert jetzt.