oggi ho ripreso in mano questo mio vecchio codice, il cui scopo era salvare una pagina con relativi css e immagini. Il codice nn funzionava, ed effettivamente era pieno di bug.
Dopo molto lavorare sono riuscito a metterlo in sesto: ora salva pagina e css (e credo anche gli altri valori in <link>).
L'ho testato sull'index del mio sito e funziona, ditemi se ha eventuali bug (credo nn funzioni ancora sulle pagine interne, ora verifico.
Il nuovo codice è:
Sono soddisfatto, perché sembrava impossibile, ma ce l'avevo fatta (di solito se mi impianto su un codice difficilemente mi sblocco)
-UPDATE: versione 2.0.2 : Integrato il salvataggio delle immagini e sistemato qualche buggino. Permane il problema che fa si che il salvataggio avvenga solo per l'index.
Dopo molto lavorare sono riuscito a metterlo in sesto: ora salva pagina e css (e credo anche gli altri valori in <link>).
L'ho testato sull'index del mio sito e funziona, ditemi se ha eventuali bug (credo nn funzioni ancora sulle pagine interne, ora verifico.
Il nuovo codice è:
Codice:
# -*- coding: iso-8859-1 -*-
#!/usr/bin/env python
#############################
# Name: Save_The_Page.py
# Author: Malex
# License: GNU/GPL 3
# Version: 2.0.2
################
"""
Run the file and do what is said.
"""
################
#imports
import httplib
from os import access,mkdir
import HTMLParser
########################
#functions
def check_url(url):
if url[0:7]!="http://":
url="http://"+url
url=url.replace("\\","/")
if (not url.find("?")) and (url[-1]=="/"):
url+="index"
return url
def get_site(url):
url=check_url(url)
site=url[7:].split("/")[0]
return site
def get_path(url):
url=check_url(url)
path="/".join(url[7:].split("/")[1:])
return path
def get_name(url):
url=check_url(url)
return url.split("/")[-1]
def check2(string):
if string[0:4]=="http":
string=string[7:]
global url
if string[0:len(get_site(url))]==get_site(url):
string=string[len(get_site(url)):]
if "?" in string:
string=string[:string.find("?")]
return string
#########################
#classes
class Parser(HTMLParser.HTMLParser):
def __init__(self,data,other):
HTMLParser.HTMLParser.__init__(self)
self.feed(data)
self.other=other
def handle_starttag(self,tag,attrs):
if tag=="link":
count=0
for i in attrs:
if "href" in i:
rel=attrs[count][1]
global con
con.putrequest("GET","/"+rel)
con.endheaders()
rel=rel.replace("/","\\")
t=rel.split("\\")
if t.count>=1:
del t[-1]
try:
mkdir(folder+"\\".join(t))
except WindowsError:
print "errore con %s" % "\\".join(t)
rel=check2(rel)
fil=open(folder+rel,'w')
fil.write(con.getresponse().read())
fil.close()
break
else:
count+=1
continue
elif tag=="img":
count=0
for i in attrs:
if "src" in i:
rel=attrs[count][1]
global con
con.putrequest("GET","/"+rel)
con.endheaders()
rel=rel.replace("/","\\")
t=rel.split("\\")
if t.count>=1:
del t[-1]
mkdir(folder+"\\".join(t))
rel=check2(rel)
fil=open(folder+rel,'wb')
fil.write(con.getresponse().read())
fil.close()
break
else:
count+=1
continue
#########################
#globals
diz={ 200 : "OK", 404 : "Page Not Found", 403 : "You haven't got the permission",
301 : "Moved Permanently", 302 : "Found", 400 : "Bad Request", 500 : "Internal Server Error",
505 : "HTTP Version Not Supported" }
#########################
print "Insert the url: "
url=check_url(raw_input())
#########################
#to do
##print "Insert S for a https connection, else press ENTER"
##q=raw_input()
#########################
while True:
print "Insert the directory where you wanna save the page"
folder=raw_input().replace("/","\\")
if access(folder,0):
break
con=httplib.HTTPConnection(get_site(url),80)
con.connect()
con.putrequest("GET","/"+get_path(url))
con.endheaders()
rep=con.getresponse()
try:
print diz[rep.status]
except KeyError:
print rep.status
a=rep.read()
fil=open(folder+get_name(url)+".html",'w')
fil.write(a)
fil.close()
ht=Parser(a,folder)
con.close()
Sono soddisfatto, perché sembrava impossibile, ma ce l'avevo fatta (di solito se mi impianto su un codice difficilemente mi sblocco)
-UPDATE: versione 2.0.2 : Integrato il salvataggio delle immagini e sistemato qualche buggino. Permane il problema che fa si che il salvataggio avvenga solo per l'index.