2017-09-26 6 views
1

Je pense où le problème est dans mon codeParsing Python objet Queue

from queue import Queue 
from threading import Thread 
from html.parser import HTMLParser 
import urllib.request 

hosts = ["http://yahoo.com", "http://google.com", "http://ibm.com"] 

queue = Queue() 

class ThreadUrl(Thread): 
    def __init__(self, queue): 
     Thread.__init__(self) 
     self.queue = queue 

    def run(self): 
     while True: 
     host = self.queue.get() 
     url=urllib.request.urlopen(host) 
     url.read(4096) 
     self.queue.task_done() 


class MyHTMLParser(HTMLParser): 
    def handle_starttag(self, tag, attrs): 
     print("Start tag:", tag) 
     for attr in attrs: 
      print("  attr:", attr) 



def consumer(): 
    for i in range(3): 
     t = ThreadUrl(queue) 
     t.setDaemon(True) 
     t.start() 

    for host in hosts: 
     parser = MyHTMLParser() 
     parser.feed(host) 
     queue.put(host) 
    queue.join() 

consumer() 

Mon but est d'extraire le contenu des URLS, lisez la file d'attente et enfin analyser it.When I exécuter le code qu'il ne n'importe quoi. Où dois-je placer l'analyseur?

+0

parser.feed (hôte) n'a pas de sens, vous devez appeler la méthode d'alimentation avec le code HTML retourné par url.read (4096). – lcastillov

+0

@ lcastillov Je comprends maintenant, mais devrais-je faire de nouvelle classe ou quoi? – MishaVacic

+0

Utilisez l'analyseur dans la méthode d'exécution et insérez simplement les URL dans la file d'attente. Créez une classe MyHTMLParser dans la méthode ThreadUrl.run et traitez les hôtes entrants. – lcastillov

Répondre

1

est un exemple:

from queue import Queue 
from threading import Thread 
from html.parser import HTMLParser 
import urllib.request 


NUMBER_OF_THREADS = 3 


HOSTS = ["http://yahoo.com", "http://google.com", "http://ibm.com"] 


class MyHTMLParser(HTMLParser): 
    def handle_starttag(self, tag, attrs): 
     print("Start tag:", tag) 
     for attr in attrs: 
      print("\tattr:", attr) 


class ThreadUrl(Thread): 
    def __init__(self, queue): 
     Thread.__init__(self) 
     self.queue = queue 

    def run(self): 
     while True: 
      host = self.queue.get() 
      url = urllib.request.urlopen(host) 
      content = str(url.read(4096)) 
      parser = MyHTMLParser() 
      parser.feed(content) 
      self.queue.task_done() 


def consumer(): 
    queue = Queue() 
    for i in range(NUMBER_OF_THREADS): 
     thread = ThreadUrl(queue) 
     thread.setDaemon(True) 
     thread.start() 
    for host in HOSTS: 
     queue.put(host) 
    queue.join() 


if __name__ == '__main__': 
    consumer()