2012-04-29 11 views
8

He estado usando BeautifulSoup para analizar archivos html, mientras que todos los scripts que escribo funcionan bien pero son lentos. Así que estoy experimentando con el uso del grupo de multiprocesamiento de trabajadores junto con BeautifulSoup para que mi programa pueda ejecutarse más rápido (tengo que abrir 100.000 - 1,000,000 de archivos html). El script que escribí es más complejo, pero he escrito un pequeño ejemplo aquí. Estoy tratando de hacer algo como esto y me siguen dando el errorError de profundidad de recursión al utilizar BeautifulSoup con el mapa de grupo de multiprocesamiento

'RuntimeError: nivel de recursividad superó mientras que el decapado de un objeto

código editado

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() 

Después de hacer algunas buscar y buscar en algunas publicaciones, llegué a saber que el error se está produciendo porque BeautifulSoup excede la profundidad de la pila del intérprete de Python. Traté de aumentar el límite y ejecutar el mismo programa (subí a 3000) pero el error sigue siendo el mismo. Dejé de aumentar el límite porque el problema es con BeautifulSoup al abrir los archivos html.

El uso de multiprocesamiento con BeautifulSoup acelerará mi tiempo de ejecución, pero no puedo averiguar cómo aplicarlo para abrir los archivos.

¿Alguien tiene otro enfoque sobre cómo usar BeautifulSoup con multiprocesamiento o cómo superar este tipo de errores?

Cualquier tipo de ayuda será apreciada, estoy sentado durante horas tratando de arreglarlo y entiendo por qué estoy recibiendo el error.

Editar

He probado el código anterior con los archivos que he dado en los caminos y me dio la misma RuntimeError que el anterior

Los archivos se puede acceder aquí (http://ec2-23-20-166-224.compute-1.amazonaws.com/sites/html_files/)

+1

El script anterior no genera el error que usted describe para mí. ¿Podría pegar el script más simple que haya probado realmente, y que _does_ genere este error? – senderle

+0

Hola, gracias por la respuesta ... acabo de probar el código con las páginas html anteriores que he dado en el enlace y obtuve el error "RuntimeError: se excedió la profundidad máxima de recursión mientras se decapaba un objeto" Gracias por la ayuda – kich

Respuesta

3

Creo que la razón es el regreso de todo el soup.title -objeto. Parece que se analizan todos los elementos children y parent y sus hijos y padres, y así sucesivamente, lo que aumenta el error de recursión.

Si el contenido del objeto es lo que necesita, simplemente puede llamar a la str -method:

return soup.title.__str__() 

Desafortunadamente, esto significa, que no tiene acceso a toda la otra información proporcionada por la biblioteca bs4 más.

Cuestiones relacionadas