Gå til innhold

Hjelp med løkker og lister/dict.


Anbefalte innlegg

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
Videoannonse
Annonse

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 av zeitgeist
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...