2017-01-26 2 views
1

Ich versuche, die HTML meiner Website zu nehmen und zu sehen, ob es das gleiche ist, was ich in einer Offline-Version habe.Wie kann ich die HTML-Datei einer Website

Ich habe dies erforscht, und alles, was ich finden kann, ist entweder Parsing oder etwas, das mit nur http beschäftigt: //

Bisher habe ich dies:

import urllib 
url = "https://www.mywebsite.com/" 
onlinepage = urllib.urlopen(url) 
print(onlinepage.read()) 
offlinepage = open("offline.txt", "w+") 
print(offlinepage.read()) 

if onlinepage.read() == offlinepage.read(): 
    print("same") # for debugging 
else: 
    print("different") 

Dies sagt immer, dass sie sind die gleichen, auch wenn ich eine andere Website komplett einstelle.

Antwort

4

Wenn Sie zuerst Ihre Online-und Offline-Seiten mit diesen Zeilen drucken:

print(onlinepage.read()) 
print(offlinepage.read()) 

... Sie haben jetzt den gesamten Text in jedes Dateiobjekt verbraucht. Nachfolgende Lesevorgänge für jedes Objekt geben eine leere Zeichenfolge zurück. Zwei leere Zeichenfolgen sind gleich, daher wird Ihre if Bedingung immer zu True ausgewertet.

Wenn Sie nur mit Dateien arbeiten, könnten Sie seek an den Anfang beider Dateien und erneut lesen. Da es keine seek Methode für das Dateiobjekt von urlopen gibt, müssen Sie entweder die Seite mit einem neuen urlopen Befehl abrufen oder, besser, speichern Sie den ursprünglichen Text in einer Variablen und verwenden Sie diese für Ihre folgenden Vergleiche:

online = onlinepage.read() 
print(online) 
offline = offlinepage.read() 
print(offline) 

... 

if online == offline: 
    ... 
+2

Was sagte er. Also müssen Sie 'x = offlinepage machen.read() 'zuerst, und dann tun Sie Ihre Vergleiche auf' x' – TehTris

+0

Side-note: Angenommen, die 'Print's sind nur zum Debuggen, und alles, was Sie wollen, ist ein" Ja/Nein ", sind die Seiten die gleichen, Sie kann Kurzschlüsse verwenden, um zeilenweise zu vergleichen, wie verfügbar, und stoppst, wenn Sie eine Diskrepanz treffen, zB: 'if all (webline == fileline für webline, fileline in itertools.zip_longest (onlineseite, offline seite)):' 'print ("selbe") ', usw. Es hat die gleichen Einschränkungen (kann nur einmal durchlaufen), aber es bedeutet, wenn sie sich im ersten Byte einer 100 MB-Datei unterscheiden, können Sie sofort aufhören, statt weiter zu lesen ist schon bekannt. – ShadowRanger

+0

Wissen Sie, wie Sie die HTML-Datei in eine TXT-Datei bekommen, ich versuche, die Datei zu nehmen, sie zu kopieren und dann zu prüfen, ob sie gleichwertig ist. – Piguinrulist

0

Sie verwenden .read() zweimal für jede Datei.

>>> f.read() 
'This is the entire file.\n' 
>>> f.read() 
'' 

"Wenn das Ende der Datei erreicht ist, f.read() eine leere Zeichenfolge ("") zurückzukehren." (7.2.1 Docs).

Daher, wenn zwei Ergebnisse verglichen werden, sind sie gleich, da jede eine leere Zeichenfolge ist.

1

Wie andere bemerkt haben, können Sie nicht das Objekt read zweimal (und kann nicht zweimal die Datei read ohne zu suchen); Nach dem Lesen sind die Daten, die Sie erhalten haben, nicht mehr verfügbar, Sie müssen sie also speichern.

Aber sie vermissten ein anderes Problem: Sie haben die Datei mit dem Modus w+ geöffnet. w+ ermöglicht das Lesen und Schreiben, aber wie der Modus w, schneidet es die Datei auf open ab. Daher ist Ihre lokale Datei immer leer, wenn Sie sie lesen, was bedeutet, dass Sie beide die lokale Datei beschädigen und nie eine Übereinstimmung erhalten (es sei denn, die Online-Datei ist auch leer).

Sie benötigen Modus verwenden r+ oder a+ einen Lese-/Schreib Griff zu bekommen, die nicht die vorhandene Datei kürzt (r+ erfordert, dass die Datei bereits vorhanden, a+ nicht, sondern setzt die Schreibposition am Ende der Datei, und auf einigen Systemen werden alle Schreibvorgänge am Ende der Datei platziert).

Also beide Fehler zu beheben, erhalten Sie:

import urllib 
url = "https://www.mywebsite.com/" 
# Using with statements properly for safe resource cleanup 
with urllib.urlopen(url) as onlinepage: 
    onlinedata = onlinepage.read() 
print(onlinedata) 

with open("offline.txt", "r+") as offlinepage: # DOES NOT TRUNCATE EXISTING FILE! 
    offlinedata = offlinepage.read() 
    print(offlinedata) 

    if onlinedata == offlinedata: 
     print("same") # for debugging 
    else: 
     print("different") 
     # I assume you want to rewrite the local page, or you wouldn't open with + 
     # so this is what you'd do to ensure you replace the existing data correctly 
     offlinepage.seek(0)  # Ensure you're seeked to beginning of file for write 
     offlinepage.write(onlinedata) 
     offlinepage.truncate() # If online data smaller, don't keep offline extra data 
Verwandte Themen