2012-06-06 8 views
6

Ich versuche eine ganze Webseite zu lesen und sie einer Variablen zuzuweisen, habe aber Probleme damit. Die Variable scheint nur die ersten 512 Zeilen der Seitenquelle zu enthalten.So lesen Sie eine ganze Webseite in eine Variable

Ich versuchte mit Hilfe von readlines(), nur alle Zeilen der Quelle auf den Bildschirm zu drucken, und das gab mir die Quelle in seiner Gesamtheit, aber ich muss in der Lage sein, mit Regex zu analysieren, also muss ich es speichern in einer Variablen irgendwie. Hilfe?

data = urllib2.urlopen(url) 
print data 

Nur gibt mir etwa 1/3 der Quelle.

data = urllib2.urlopen(url) 
for lines in data.readlines() 
     print lines 

Dies gibt mir die gesamte Quelle.

Wie gesagt, ich muss in der Lage sein, die Zeichenfolge mit Regex zu analysieren, aber der Teil, den ich brauche, ist nicht im ersten 1/3, das ich in meiner Variablen speichern kann.

+2

möglich duplicate von [Download html Seite und ihr Inhalt] (http://stackoverflow.com/questions/1825438/download-html-page-and-its-content) –

Antwort

4

Sie sollten file.read() verwenden können, um die gesamte Datei in eine Zeichenfolge zu lesen. Das wird dir die gesamte Quelle geben. Etwas wie

data = urllib2.urlopen(url) 
print data.read() 

sollte Ihnen die gesamte Webseite geben.

Von dort, nicht analysieren HTML mit Regex (abgenutzter Beitrag zu diesem Zweck here), sondern verwenden Sie stattdessen einen dedizierten HTML-Parser. Alternativ können Sie den HTML-Code bereinigen und ihn in XHTML konvertieren (z. B. mit HTML Tidy) und dann eine XML-Parsing-Bibliothek wie den Standard ElementTree verwenden. Welcher Ansatz am besten ist, hängt von Ihrer Anwendung ab.

+0

Dies gibt mir nicht mehr von der Webseite als mein erstes Beispiel. – Rentafence

0

Ich würde auch empfehlen, opensource Web-Parsing-Bibliotheken für einfache Arbeit zu verwenden, anstatt regex für vollständiges HTML-Parsing zu verwenden, wie Sie Regex für URL-Parsing brauchen.

0

Eigentlich sollte print data Ihnen keinen HTML-Inhalt geben, weil es nur ein Dateizeiger ist. Offizielle Dokumentation https://docs.python.org/2/library/urllib2.html:

Diese Funktion gibt eine dateiähnliche Objekt

Das ist, was ich habe:

print data 
<addinfourl at 140131449328200 whose fp = <socket._fileobject object at 0x7f72e547fc50>> 

readlines() kehrt Liste von Zeilen HTML-Quellcode und Sie können es speichern in einer Zeichenfolge wie:

import urllib2 
data = urllib2.urlopen(url) 
l = [] 
s = '' 
for line in data.readlines(): 
    l.append(line) 
s = '\n'.join(l) 

Sie können entweder die Liste l oder die Zeichenkette s entsprechend Ihren Anforderungen verwenden.