meastp Skrevet 5. mars 2007 Del Skrevet 5. mars 2007 Hei! Jeg har et lite problem. Skriver et program som skal gi navn til tv-seriefiler ut i fra informasjon fra tv.com. Klikk for å se/fjerne innholdet nedenfor #!/usr/bin/python # -*- coding: utf-8 -*- import urllib, re, os from BeautifulSoup import BeautifulSoup def strip_ml_tags(in_text): """ Routine by Micah D. Cochran Submitted on 26 Aug 2005 This routine is allowed to be put under any license Open Source (GPL, BSD, LGPL, etc.) License or any Propriety License. Effectively this routine is in public domain. Please attribute where appropriate. strip_ml_tags(test_text) """ s_list = list(in_text) i,j = 0,0 while i < len(s_list): if s_list[i] == '<': while s_list[i] != '>': s_list.pop(i) s_list.pop(i) else: i=i+1 join_char='' return join_char.join(s_list) if __name__ == '__main__': import doctest doctest.testmod() class TVcom: #Funksjon for aa parse info om tv-serier fra tv.com def __init__(self, adr) : ''' klargjøre info fra tv.com hente via beautiful soup ''' self.adr = adr #adr = episode-guide => alle episoder data = urllib.urlopen(self.adr) doc = data.read() soup = BeautifulSoup(''.join(doc)) #Bruker BeautifulSoup for a hente info html = soup.findAll('div', id="episode-guide") self.html = html def getNrName (self) : ''' Episodenummer og tittel ''' doc = str(self.html) soup = BeautifulSoup(''.join(doc)) data = soup.findAll('h1', "f-18 f-666") # henter alle episodenummer og -navn ut fra h1-taggen i = 0 #listenr = [ 'zero' ] # legger til 'zero' for a synkronisere episodenummer og listenummer f.eks episode 1 = liste[1] listename = [ 'zero' ] while i < len(data): txt = strip_ml_tags(str(data[i])) txt2 = txt.replace('\n', ' ') txt3 = txt2.split(' (edit) ')[0] #number1 = txt3.split('.')[0] #number2 = number1.strip() name1 = txt3.split('.')[1] name2 = name1.strip() #listenr.append(number2) listename.append(name2) i += 1 #self.Nr = listenr self.Name = listename def getProdnrSent(self) : ''' Produksjonsnummer (101, 109, 203) og ##ikkeimplementertenda## dato for første sending''' doc = str(self.html) soup = BeautifulSoup(''.join(doc)) data = soup.findAll('span', "f-bold") i = 0 listeprodnrseason = [ 'zero' ] listeprodnrepisode = [ 'zero' ] listeprodnrseep = [ 'zero' ] regex = re.compile(r'([0-9])([0-9][0-9])') while i < len(data): txt = strip_ml_tags(str(data[i])) if "Code: " in txt: txt2 = txt.split('Code: ')[1] # sortere ut production code (f.eks 101) season = regex.search(txt2).groups()[0] episode = regex.search(txt2).groups()[1] season2 = "%.2d" % int(season) episode2 = "%.2d" % int(episode) listeprodnrseason.append(season2) listeprodnrepisode.append(episode2) listeprodnrseep.append('S' + season2 + 'E' + episode2) else : listeprodnrseason.append('Special') listeprodnrepisode.append('Special') listeprodnrseep.append('Special') i += 1 self.Prodnrseason = listeprodnrseason self.Prodnrepisode = listeprodnrepisode self.listseep = listeprodnrseep def getDescr(self) : '''Beskrivelse av episoden''' doc = str(self.html) soup = BeautifulSoup(''.join(doc)) data = soup.findAll('p') i = 0 liste = [ 'zero' ] while i < len(data): liste.append(strip_ml_tags(str(data[i]))) i += 1 self.Descr = liste class DirFiles: ''' Hente ut filene det er snakk om ''' def __init__(self, path) : ''' Bør tenke på sti. Bør ikke dette komme fra fila? ''' self.path = path def FileScan(self): net = TVcom('http://www.tv.com/greys-anatomy/show/24440/episode_guide.html?season=0&tag=season_dropdown;dropdown;3') tvshow = [ 'Grey\'s Anatomy', 'grey\'s anatomy', 'greys.anatomy' ] #Må finne en listemetode med mange show, og mange stavemåter per show. #tvshow = [ 'greysanatomy', 'heroes', 'csi' ] #greysanatomy = [ 'Grey\'s Anatomy', 'grey\'s anatomy', 'greys.anatomy' ] #heroes = [ 'Heroes', 'heroes' ] #csi = [ 'CSI', 'csi', 'c.s.i' ] #net.getDescr() Trenger ikke beskrivelser enda. net.getProdnrSent() net.getNrName() os.chdir(self.path) regex = re.compile(r'[Ss]([0-9]+)[Ee]([0-9]+)') regex2 = re.compile(r'([0-9])([0-9][0-9])') regex3 = re.compile(r'([0-9]+)x([0-9]+)') for file in os.listdir(self.path): file2 = file.lower() for tvshow_navn in tvshow : #for tvshow_navn_navn in tvshow_navn : if tvshow_navn in file2: if regex.search(file) : season = regex.search(file).groups()[0] season2 = "%.2d" % int(season) episode = regex.search(file).groups()[1] episode2 = "%.2d" % int(episode) liste = net.listseep liste2 = 'S' + season2 + 'E' + episode2 index = liste.index(liste2) newfile = tvshow[0] + ' - ' + liste2 + ' - ' + net.Name[index] + '.avi' if os.path.isfile(newfile) : print 'filen ' + newfile + ' finnes allerede!' else : os.rename(file, newfile) print 'gitt ' + file + ' det nye navnet ' + newfile elif regex2.search(file) : season = regex2.search(file).groups()[0] season2 = "%.2d" % int(season) episode = regex2.search(file).groups()[1] episode2 = "%.2d" % int(episode) print season2 + ' ' + episode2 elif regex3.search(file) : season = regex3.search(file).groups()[0] season2 = "%.2d" % int(season) episode = regex3.search(file).groups()[1] episode2 = "%.2d" % int(episode) print season2 + ' ' + episode2 else : print 'Ukjent mønster' else: print file + ' er ikke en registrert tv-serie' files = DirFiles('/home/meastp/tvcom/') files.FileScan() Problemet ligger i FileScan. Jeg skulle hatt en måte som samlet navnet jeg vil gi i filnavnet, f.eks 'Grey's Anatomy' 'Heroes' eller 'CSI', måter det er stavet på i filnavnet før navneendring 'greys.anatomy' 'grey's.anatomy' 'heroes' 'csi' eller 'c.s.i.', og adresse til området jeg henter info fra på tv.com. Funksjonen må søke i mulige navn, finner den i et av showene, må den gi det filnavnet jeg har valgt, og bruke riktig adresse i Tvcom(). Noen som kan gi noen hint? Lenke til kommentar
zeitgeist Skrevet 6. mars 2007 Del Skrevet 6. mars 2007 (endret) Jeg har ikke satt meg grundig inn i koden din, men jeg tror du vil for mye. En mulig vei er å søke etter deler av strengen(e), en mer spennende vei kan være get_close_matches() i difflib. Men jeg tror det er vanskelig å lage noe som er idiotsikkert Endret 6. mars 2007 av zeitgeist Lenke til kommentar
meastp Skrevet 8. mars 2007 Forfatter Del Skrevet 8. mars 2007 Hmm... det jeg i prinsippet vil, er jo å matche "feilstavinger", og så rette disse i filnavnet senere. Skulle jo gå an å gjøre dette i en liste eller dict, evt tuple? å hente noe fra tv.com er langt fra idiotsikkert i utgangspunktet. (html)Koden er ikke helt bra, og det er brukerbidrag jeg baserer meg på. Dessuten: Ingenting er idiotsikkert, for idioter er så oppfinnsomme.. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå