2010-04-26 21 views
5

Tengo un código que usa la biblioteca BeautifulSoup para analizar, pero es muy lento. El código está escrito de tal manera que los hilos no pueden ser utilizados. ¿Alguien puede ayudarme con esto?Optimizar código BeautifulSoup (Python)

Estoy usando BeautifulSoup para analizar y guardar en una base de datos. Si hago un comentario sobre la declaración save, todavía tarda mucho tiempo, por lo que no hay ningún problema con la base de datos.

def parse(self,text):     
    soup = BeautifulSoup(text) 
    arr = soup.findAll('tbody')     

    for i in range(0,len(arr)-1): 
     data=Data() 
     soup2 = BeautifulSoup(str(arr[i])) 
     arr2 = soup2.findAll('td') 

     c=0 
     for j in arr2:          
      if str(j).find("<a href=") > 0: 
       data.sourceURL = self.getAttributeValue(str(j),'<a href="') 
      else: 
       if c == 2: 
        data.Hits=j.renderContents() 

      #and few others... 

      c = c+1 

      data.save() 

¿Alguna sugerencia?

Nota: Ya he hecho esta pregunta here pero estaba cerrada debido a información incompleta.

Respuesta

6
soup2 = BeautifulSoup(str(arr[i])) 
arr2 = soup2.findAll('td') 

No haga esto: Simplemente llame al arr2 = arr[i].findAll('td') en su lugar.


Esto también será lenta:

if str(j).find("<a href=") > 0: 
    data.sourceURL = self.getAttributeValue(str(j),'<a href="') 

Suponiendo que getAttributeValue le da el atributo href, utilizar esto en su lugar:

a = j.find('a', href=True)  #find first <a> with href attribute 
if a: 
    data.sourceURL = a['href'] 
else: 
    #.... 

En general, usted no debe necesita convertir el objeto BeautifulSoup en una cadena si todo lo que quiere hacer es analizarlo y extraer v alues. Dado que los métodos find y findAll le devuelven objetos de búsqueda, puede seguir buscando invocando el find/findAll/etc. métodos en los resultados.