2010-04-26 34 views
5

Tôi có mã sử dụng thư viện BeautifulSoup để phân tích cú pháp, nhưng nó rất chậm. Mã được viết theo cách mà các luồng không thể được sử dụng. Có ai có thể giúp tôi với điều này không?Tối ưu hóa mã BeautifulSoup (Python)

Tôi đang sử dụng BeautifulSoup để phân tích cú pháp và lưu vào DB. Nếu tôi nhận xét ra tuyên bố save, nó vẫn mất một thời gian dài, do đó, không có vấn đề với cơ sở dữ liệu.

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

Mọi đề xuất?

Lưu ý: Tôi đã đặt câu hỏi này here nhưng đã bị đóng do thông tin không đầy đủ.

Trả lời

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

Đừng làm điều này: Chỉ cần gọi arr2 = arr[i].findAll('td') thay thế.


Đây cũng sẽ là chậm:

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

Giả sử rằng getAttributeValue cung cấp cho bạn các thuộc tính href, sử dụng này để thay thế:

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

Nói chung, bạn không nên cần phải chuyển đổi đối tượng BeautifulSoup thành chuỗi nếu tất cả những gì bạn muốn làm là phân tích cú pháp và trích xuất v alues. Vì các phương thức findfindAll cung cấp cho bạn các đối tượng có thể tìm kiếm lại, bạn có thể tiếp tục tìm kiếm bằng cách gọi số find/findAll/v.v. phương pháp trên các kết quả.