我正在尝试使用我的网站的HTML,看看它是否与我在离线版本上的相同。
我一直在研究这个,我所能找到的只是解析或只处理http://
的东西到目前为止,我有这个:
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")
这总是说它们是相同的,即使我完全放入不同的网站。
答案 0 :(得分:4)
首次使用以下行打印在线和离线页面时:
print(onlinepage.read())
print(offlinepage.read())
...您现在已经消耗了每个文件对象中的所有文本。对任一对象的后续读取将返回空字符串。两个空字符串相等,因此您的if
条件将始终评估为True
。
如果您纯粹使用文件,则可以seek
到两个文件的开头并再次阅读。由于seek
文件对象上没有urlopen
方法,因此您需要使用新的urlopen
命令重新获取页面,或者更好地保存原始文件变量中的文本,并用于后续比较:
online = onlinepage.read()
print(online)
offline = offlinepage.read()
print(offline)
...
if online == offline:
...
答案 1 :(得分:1)
正如其他人所说,你不能read
两次请求对象(如果没有寻求,则不能read
两次文件;一旦阅读,您获得的数据将不再可用,因此您需要存储它。
但他们错过了另一个问题:您使用模式w+
打开了文件。 w+
允许读取和写入,但是,就像模式w
一样,它会截断open
上的文件。因此,当您阅读本地文件时,您的本地文件始终为空,这意味着您既破坏了本地文件又从未获得匹配(除非在线文件也是空的)。
您需要使用模式r+
或a+
来获取不会截断现有文件的读/写句柄(r+
要求该文件已存在,{{1不会,但是将写入位置放在文件的末尾,而在某些系统上,所有的写入都放在文件的末尾。)
因此,修复两个错误,你得到:
a+
答案 2 :(得分:0)
您在每个文件上使用.read()
两次。
>>> f.read()
'This is the entire file.\n'
>>> f.read()
''
“如果已到达文件末尾,f.read()将返回一个空字符串(""
)。” (7.2.1 Docs)。
因此,当比较两个结果时,它们是相等的,因为每个结果都是一个空字符串。