FraXinuS Skrevet 28. april 2006 Skrevet 28. april 2006 Jeg har laget denne saken her, men får den ikke til å funke helt. import urllib2 import re import string class ImdbParser: di = {} def __init__(self, url): self.url = urllib2.urlopen(url) def imdbData(self): return (("Plot Outline", r'Plot.*:</b> (.*\.)\.?>?'), ("Rating", r'<b>(\d.*)</b> (\(.*\))'), ("Genre", r'/Genres/.*/">(\w*)</a>'), ("Year", r'"/Sections/Years/\d*">(\d*)</a>'), ("Runtime", r'(\d* min)'), ("Language", r'"/Sections/Languages/.*">(.*)</a>')) def getInfo(self): for name, pat in self.imdbData(): pat = re.compile(pat) for line in self.url: m = pat.search(line) if m: if name == "Rating": ImdbParser.di[name] = m.group(1) +' '+ m.group(2) elif name == "Genre": pat2 = re.compile(r'>(\w*-?\w*)<') m2 = pat2.findall(m.group()) if m2: genres = string.join(m2, '/') ImdbParser.di[name] = genres else: ImdbParser.di[name] = m.group(1) url = 'http://imdb.com/title/tt0096895/' test = ImdbParser(url) test.getInfo() print ImdbParser.di Den henter bare Plot Outline seks gang etterhverandre istedet for å gå vidre å hente rating og genre osv. Hvorfor går den ikke vidre og henter resten av infoen?
zeitgeist Skrevet 28. april 2006 Skrevet 28. april 2006 Jeg har laget denne saken her, men får den ikke til å funke helt. Kanskje fordi du kjører regexen'ene på hver linje og dermed ikke får treff når teksten spenner over flere linjer?
FraXinuS Skrevet 28. april 2006 Forfatter Skrevet 28. april 2006 (endret) Det funker hvis jeg tar en og en av gangen. Så jeg får ned den infoen jeg skal ha. Men problemet er at ikke den går vidre og henter all dataen en etter en når det er flere ting i den tuplen. Den starter fint med plot outline og henter ned det og det funker fint. Etter det så er det meningen at det skal gå videre til rating, genre, osv. Men det skjer ikke, etter at den har hentet plot outline, så går det ikke vidre til rating, den henter bare plot outline ned på nytt igjen like mange ganger som det ting i tuplen, tror jeg. Jeg skjønner ikke hvorfor det gjør det. Endret 28. april 2006 av FraXinuS
zeitgeist Skrevet 29. april 2006 Skrevet 29. april 2006 Det funker hvis jeg tar en og en av gangen. Så jeg får ned den infoen jeg skal ha. Men problemet er at ikke den går vidre og henter all dataen en etter en når det er flere ting i den tuplen. Den starter fint med plot outline og henter ned det og det funker fint. Etter det så er det meningen at det skal gå videre til rating, genre, osv. Men det skjer ikke, etter at den har hentet plot outline, så går det ikke vidre til rating, den henter bare plot outline ned på nytt igjen like mange ganger som det ting i tuplen, tror jeg. Jeg skjønner ikke hvorfor det gjør det. 6007621[/snapback] Løkkene kjører som de skal. Men du scanner linje for linje av HTML'en. I det er bare for "Plot Outline" at alt er på en linje i HTML'en. Defor får du bare treff på den - dvs if m: evalueres til False.
FraXinuS Skrevet 29. april 2006 Forfatter Skrevet 29. april 2006 Men hvis jeg fjerner alt utenom f.eks rating så henter den rating. f eks slik. Her henter den rating: def imdbData(self): return (("Rating", r'<b>(\d.*)</b> (\(.*\))'), ) Her henter den kun plot outline: def imdbData(self): return (("Plot Outline", r'Plot.*:</b> (.*\.)\.?>?'), ("Rating", r'<b>(\d.*)</b> (\(.*\))')) Jeg skjønner ikke hvorfor den ikke henter rating på den nederste. Det henter jo rating på den øverste, så da burde det jo ikke m bli false på rating i den nederste.
zeitgeist Skrevet 29. april 2006 Skrevet 29. april 2006 (endret) Men hvis jeg fjerner alt utenom f.eks rating så henter den rating. f eks slik. Her henter den rating: def imdbData(self): return (("Rating", r'<b>(\d.*)</b> (\(.*\))'), ) Her henter den kun plot outline: def imdbData(self): return (("Plot Outline", r'Plot.*:</b> (.*\.)\.?>?'), ("Rating", r'<b>(\d.*)</b> (\(.*\))')) Jeg skjønner ikke hvorfor den ikke henter rating på den nederste. Det henter jo rating på den øverste, så da burde det jo ikke m bli false på rating i den nederste. 6007779[/snapback] Beats me. Men hva med å trekke ut det du trenger, fjerne line-breaks og søke kun i det? Noe slikt: import urllib def extractor(html): " extract relevant parts of imdb html " def extract(data, kw, end = '<br>'): part = data.split(kw)[1] relevant = part.split(end, 1)[0] return relevant.replace('\n', '') data_stubs = {} # fix line-break consistency html = html.replace('Plot Outline:</b>', 'Plot Outline:</b>\n') tag1 = '<b class="ch">' tag2 = '</b>' keywords = ['Genre', 'Plot Outline', 'User Rating', 'Runtime', 'Language'] searches = [tag1 + kw + ':' + tag2 for kw in keywords] for srch in searches: data_stubs[keywords.pop(0)] = extract(html, srch) # year is special data_stubs['Year'] = html.split('/Sections/Years/')[1][0:4] return data_stubs url = 'http://imdb.com/title/tt0096895/' data = urllib.urlopen(url).read() imdb_data = extractor(data) Og så loope igjennom imdb_data og søke i value. Slik som du gjør det nå, så kjører du jo regex-søkene 3000 ganger, 6 ganger per linje ;-) Endret 29. april 2006 av zeitgeist
zeitgeist Skrevet 29. april 2006 Skrevet 29. april 2006 Jeg skjønner ikke hvorfor den ikke henter rating på den nederste. Det henter jo rating på den øverste, så da burde det jo ikke m bli false på rating i den nederste. 6007779[/snapback] Nå skjønte jeg det! self.url = urllib2.urlopen(url) lager en iterator og den "konsumeres" etter en gangs gjennomkjøring. Si self.url = urllib2.urlopen(url).readlines() i stedet, eller self.url = list(urllib2.urlopen(url)) og det funker. Men ... når det er sagt, så er ikke rutinen din akkurat effektiv. Jeg trodde først det var imdb som var treg, men det er faktisk regex-søkene dine som tar tid.
FraXinuS Skrevet 29. april 2006 Forfatter Skrevet 29. april 2006 Der funka det ja! Tenkte ikke på at det kanskje var noe med urlopen. Hadde faktisk samme problem på en annen ting jeg lagde for litt siden. Men nå vet jeg hvertfall det til neste gang. Den er kanskje ikke så veldig effektiv nei hehe, men det er ikke så viktig i den greia jeg lager uansett. Men merka den ble litt raskere når jeg brukte den saken du lagde, så jeg får kanskje prøve å gjøre noe slik etterhvert.
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å