2010-04-26 8 views
5

구문 분석을 위해 BeautifulSoup 라이브러리를 사용하는 코드가 있지만 매우 느립니다. 코드는 스레드를 사용할 수 없도록 작성됩니다. 아무도 도와 줄 수 있습니까?BeautifulSoup (Python) 코드 최적화

구문 분석 및 DB에 저장하기 위해 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 객체를 다시 문자열로 변환해야합니다. 고백한다. findfindAll 메소드는 검색 가능한 객체를 다시 제공하므로 find/findAll/etc를 호출하여 검색을 계속 수행 할 수 있습니다. 결과에 대한 방법.