2010-04-26 76 views
5

我有使用BeautifulSoup庫解析的代碼,但它非常慢。代碼的編寫方式使線程無法使用。 任何人都可以幫助我嗎?優化BeautifulSoup(Python)代碼

我使用BeautifulSoup進行解析並保存到數據庫中。如果我註釋掉save聲明,它仍然需要很長時間,所以數據庫沒有問題。

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

有什麼建議嗎?

說明:我已經提出這個問題here但由於信息不完整而關閉。

回答

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

不要這樣做:只需撥打arr2 = arr[i].findAll('td')代替。


這也將是緩慢的:

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

假設getAttributeValue給你href屬性,而不是使用:

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

一般情況下,你不應該需要將BeautifulSoup對象轉換回字符串,如果你想要做的就是解析它並提取v alues。由於findfindAll方法爲您提供可搜索對象,因此您可以通過調用find/findAll/etc來繼續搜索。方法的結果。