Find, Replace für Webseiten

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Gast

hallo zusammen,

nachstehend die erste fassung eines neuen programms von mir.
ihr könnt damit webseiten verändern, interessant ist z.b. folgendes.
in den 220 html seiten hat sich durch copy und paste ein fehler in einen der meta tags eingeschlichen, fein wenn man nicht manuell alle 220 seiten ausbessern muss :D


gibt sicherlich schon solche tools oder andere lösungswege, ich mags und habe es schon oft verwendet.

ich hoffe euch gefällt es, natürlich bin ich wie immer offen für konstruktive kritik und verbesserungsvorschläge,...

also los, das eigentliche programm:

Code: Alles auswählen


#!/usr/bin/env python

import ftplib, os
from Tkinter import *
from ScrolledText import*
import tkMessageBox
from ftptools import *
from filetools import read_content, change_content
 


    
class WindowForChangeContentFtp:
    

    distance_x=5
    distance_y=5 
    width=20
    color="#FFFFFF"    
    

    def __init__(self):

        self.root=Tk()

        self.root.wm_geometry('+20+20')
        
        self.root.title("Window")
        
        self.root.resizable(0,0)
        
        self.root.protocol("WM_DELETE_WINDOW", self.mainexit)
        
        self.root.minsize=(300,200)

        label_1=Label(self.root,bg=self.color,
                      text="///GARO_GUI")
        label_1.grid(row=0,column=0,
                     columnspan=2,
                     padx=self.distance_x,
                     pady=self.distance_y)

        
        label_2=Label(self.root,text="Find")
        label_2.grid(row=1,column=0,
                     padx=self.distance_x,

                     pady=self.distance_y)

        self.entry_1=Entry(self.root)
        self.entry_1.grid(row=1,column=1,
                          padx=self.distance_x,
                          pady=self.distance_y)
        
        label_3=Label(self.root,text="Replace")
        label_3.grid(row=2,column=0,
                     padx=self.distance_x,
                     pady=self.distance_y)
            
        self.entry_2=Entry(self.root)
        self.entry_2.grid(row=2,column=1,
                          padx=self.distance_x,
                          pady=self.distance_y)
 
        scrollbar_a=Scrollbar(self.root,orient="vertical")

        self.listbox_a=Listbox(self.root,
                               width=50,height=20,
                               selectmode=MULTIPLE,
                               yscrollcommand=scrollbar_a.set)
        
        scrollbar_a["command"]=self.listbox_a.yview
        scrollbar_a.grid(row=3,column=2,
                         padx=self.distance_x,
                         pady=self.distance_y)
        
        self.listbox_a.grid(row=3,
                            column=0,
                            columnspan=2,
                            padx=self.distance_x,
                            pady=self.distance_y)

        scrollbar_b=Scrollbar(self.root,orient="vertical")

        self.listbox_b=Listbox(self.root,
                               width=50,height=2,
                               selectmode=MULTIPLE,
                               yscrollcommand=scrollbar_b.set)
        
        scrollbar_b["command"]=self.listbox_b.yview
        scrollbar_b.grid(row=4,
                         column=2,
                         padx=self.distance_x,
                         pady=self.distance_y)
        
        self.listbox_b.grid(row=4,
                            column=0,columnspan=2,
                            padx=self.distance_x,
                            pady=self.distance_y)
        button_1=Button(self.root,
                        width=self.width,
                        text="Start",
                        command=self.work_file)
        button_1.grid(row=5,column=0,
                      columnspan=2,
                      padx=self.distance_x,
                      pady=self.distance_y)
        
        button_2=Button(self.root,text="Prog. Beenden",
                        width=10,command=self.ende)
        button_2.grid(row=6,column=0,
                      columnspan=2,
                      padx=10,pady=10)
        

        self.download_dir="./python_download"

        if not os.path.exists(self.download_dir):
            try:
                os.mkdir(self.download_dir)
            except OSError, msg:
                self.showerror(msg,option=1)

        try:
            self.ftptools=FtpTools()
            
        except IOError,msg:
            self.showerror(msg,option=1)
    
        try:
            connect=self.ftptools.ftp_connect()
            my_list=self.ftptools.ftp_list_html()
            for i in range(len(my_list)):
                self.listbox_a.insert("end",(my_list[i]))

        except ftplib.all_errors,msg:
            self.showerror(msg,option=1)


    def evaluate(self):

        find_string=self.entry_1.get()
        if find_string=="":
            self.showerror("Find darf nicht leer sein!")

        else:
            replace_string=self.entry_2.get()
            replacements=[(find_string,replace_string)]

            try:
                choice=self.listbox_a.selection_get().split()
                return choice, replacements

            except TclError:
                self.showerror("Dateien auswaehlen!")


    def work_file(self):

        try:
            choice,replacements=self.evaluate()
            try:
                self.ftptools.ftp_download(self.download_dir,
                                     choice)
                
            except ftplib.error_temp:
                self.conn=self.ftptools.ftp_connect()
                self.ftptools.ftp_download(self.download_dir,
                                     choice)
          
            for filename in choice:
                content=read_content(self.download_dir,filename)
                content=change_content(content,replacements)

                try:
                    self.ftptools.ftp_upload(filename,content)
                    self.listbox_b.insert(0,"Sucess, %s saved und uploaded!" % filename)

                except ftplib.all_errors,msg:
                    self.showerror(msg)
                    
        except TypeError:
            pass
        
           
    def ende(self):

        answer=tkMessageBox.askyesno("Warnung",
                                     "Sicher beenden?")
        if answer==1:
            sys.exit(0)
        

    def mainexit(self):
        
        self.root.withdraw()


    def showerror(self,info,option=0):
        tkMessageBox.showerror("Fehler",info)
        if option==1:
            sys.exit(0)
       


 
if __name__=='__main__':
    

    wfccf=WindowForChangeContentFtp()
    mainloop()
das erste der beiden module, die man noch dazu braucht:

Code: Alles auswählen

#!/usr/bin/env python


import ftplib, pickle, os


class FtpTools:
    

    def __init__(self,ftp_dir='/html/crossover'):


        current_path=os.getcwd()
        data_path=current_path+'/ftpdata.txt'
        f=file(data_path,'rb')
        content=pickle.load(f)
        f.close()
        self.domain=content['domain']
        self.user=content['user']
        self.pwd=content['pwd']
        self.ftp_dir=ftp_dir


    def ftp_connect(self):

        self.conn=ftplib.FTP(self.domain,
                        self.user,
                        self.pwd)
        self.conn.cwd(self.ftp_dir)


    def ftp_list_html(self,pattern="*htm*"):

        import fnmatch
        my_list=fnmatch.filter(self.conn.nlst(),pattern)
        return my_list


    def ftp_download(self,download_path,choice):

        for element in choice:
            f=file(download_path+'/'+element,'w')
            self.conn.retrbinary('RETR %s' %element, f.write)
            f.close()
         

    def ftp_upload(self,filename, content):
        from StringIO import StringIO
        f = StringIO(content)
        self.conn.storlines('STOR %s' % filename, f)
        f.close() 

     


if __name__=='__main__':

    ftptools=FtpTools()
und noch nummer zwei...

Code: Alles auswählen

#!/usr/bin/env python


def read_dir(my_path):
    
    dir_index=[f for f in os.listdir(my_path)]
    return dir_index


def read_content(my_path,filename):
    
    f=file(my_path+'/'+filename,'r')
    content=f.read()
    f.close()
    return content


def change_content(content,replacements):

    for old, new in replacements:
        content=content.replace(old, new)

    return content


def write_new_file(filename,content):
    
    f=file(download_dir+'/'+filename,'w')
    f.write(content)
    f.close()
hoffe es ist hilfreich, viel spass,

grüße

rolgal
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Hallo zusammen,

nachdem ich mich wieder mit Pyhton beschäftige, habe ich versucht dieses Programm, jetzt allerdings unter Windows, zum Laufen zu bringen.

Einiges habe ich schon angepasst,... ich bekomme momentan immer folgende Fehlermeldung und ich kann mit der nichts anfangen:
Traceback (most recent call last):
File "C:\Users\rolgal\Documents\Programmierung\ChangeHtml\gui.py", line 211, in <module>
wfccf=WindowForChangeContentFtp()
File "C:\Users\rolgal\Documents\Programmierung\ChangeHtml\gui.py", line 126, in __init__
self.ftptools=FtpTools()
File "C:\Users\rolgal\Documents\Programmierung\ChangeHtml\ftptools.py", line 17, in __init__
content=pickle.load(f)
File "C:\Python27\lib\pickle.py", line 1378, in load
return Unpickler(file).load()
File "C:\Python27\lib\pickle.py", line 858, in load
dispatch[key](self)
KeyError: 'w'
Es betrifft also den Abschnitt:

Code: Alles auswählen

class FtpTools:
   
 
    def __init__(self,ftp_dir='/html/crossover'):
 
 
        current_path=os.getcwd()
        data_path=current_path+'/ftpdata.txt' # bzw. für Windows "//ftpdata.txt" oder?
        f=file(data_path,'rb')
        content=pickle.load(f)
        f.close()
        self.domain=content['domain']
        self.user=content['user']
        self.pwd=content['pwd']
        self.ftp_dir=ftp_dir
Bedanke mich im Voraus. rolgal_reloaded
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

>>> {"a":1, "b":2}["W"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'W'
Pfade solltest du mit os.path.join zusammensetzen und Dateien mittels open (nicht file) und with-Statement öffnen. Dann werden die auch immer wieder vernünftig geschlossen:

Code: Alles auswählen

open(filename, "rb") as fp:
    content = pickle.load(fp)

Der Name der Klasse hört sich sehr seltsam an. Als würdest du damit ein Modul in einem Modul erstellen.
Das Leben ist wie ein Tennisball.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

@EyDu

Danke, werde ich mir ansehen.

Der Fehler lag in einer völlig falschen Datei für die Verbindung. Jetzt funzt wieder alles.
Antworten