2012-04-29 14 views
8

Ho usato BeautifulSoup per analizzare i file html, mentre tutti gli script che scrivo funzionano bene ma lentamente. Quindi sto sperimentando l'utilizzo del pool di processori multiprocessing insieme a BeautifulSoup, in modo che il mio programma possa essere eseguito più velocemente (ho bisogno di 100.000 - 1.000.000 di file html da aprire). La sceneggiatura che ho scritto è più complessa ma ho scritto un piccolo esempio qui sotto. Sto cercando di fare qualcosa di simile e io continuo a ricevere l'erroreErrore di profondità di ricorsione quando si utilizza BeautifulSoup con la mappa del pool di multiprocessing

'RuntimeError: massima profondità di ricorsione superato durante decapaggio un oggetto'

cura Codice

from bs4 import BeautifulSoup 
from multiprocessing import Pool 
def extraction(path): 
    soup=BeautifulSoup(open(path),"lxml") 
    return soup.title 

pool=Pool(processes=4) 
path=['/Volume3/2316/http/www.metro.co.uk/news/852300-haiti-quake-victim-footballers-stage-special-tournament/crawlerdefault.html','/Volume3/2316/http/presszoom.com/story_164020.html'] 
print pool.map(extraction,path) 
pool.close() 
pool.join() 

Dopo aver fatto alcune cercare e scavare attraverso alcuni post, ho avuto modo di sapere che l'errore si sta verificando perché BeautifulSoup sta superando la profondità dello stack dell'interprete python. Ho provato ad aumentare il limite ed eseguire lo stesso programma (sono andato su a 3000) ma l'errore rimane lo stesso. Ho smesso di aumentare il limite perché il problema è con BeautifulSoup quando si aprono i file html.

L'utilizzo di multiprocessing con BeautifulSoup velocizza il tempo di esecuzione, ma non sono in grado di capire come applicarlo per aprire i file.

Qualcuno ha un altro approccio su come utilizzare BeautifulSoup con il multiprocessing o come superare questi tipi di errori?

Qualsiasi tipo di aiuto sarà apprezzato, sono seduto per ore cercando di risolverlo e capire perché sto ottenendo l'errore.

Modifica

Ho testato il codice di cui sopra con i file ho dato nei percorsi e ho ottenuto lo stesso RuntimeError come sopra

I file sono accessibili qui (http://ec2-23-20-166-224.compute-1.amazonaws.com/sites/html_files/)

+1

Lo script sopra non genera l'errore che descrivi per me. Potresti incollare lo script più semplice che hai effettivamente testato e che _does_ genera questo errore? – senderle

+0

Ciao, grazie per la risposta .. ho appena testato il codice con le pagine html sopra indicate nel link e ho ricevuto l'errore "RuntimeError: massima profondità di ricorsione superata durante il pickling di un oggetto" Grazie per l'aiuto – kich

risposta

3

Penso che la ragione sia la restituzione dell'intero oggetto soup.title. Sembra che tutti gli elementi children e parent e i loro figli e genitori e così via vengano analizzati in questo momento, e ciò solleva l'errore di ricorsione.

Se il contenuto dell'oggetto è quello che serve, si può semplicemente chiamare il str -Metodo:

return soup.title.__str__() 

Purtroppo, questo significa, non si ha accesso a tutte le altre informazioni fornite dalla libreria bs4 più.

Problemi correlati