Gå til innhold

Anbefalte innlegg

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?

Lenke til kommentar
Videoannonse
Annonse

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

Lenke til kommentar

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.

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

Lenke til kommentar

Der funka det ja! :thumbup:

 

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.

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...