2012-04-29 24 views
8

Tôi đã sử dụng BeautifulSoup để phân tích cú pháp các tệp html, trong khi tất cả các tập lệnh tôi viết hoạt động tốt nhưng chậm. Vì vậy, tôi đang thử nghiệm về việc sử dụng đa xử lý nhóm công nhân cùng với BeautifulSoup để chương trình của tôi có thể chạy nhanh hơn (tôi có 100.000 - 1.000.000 tệp html để mở). Kịch bản tôi viết phức tạp hơn nhưng tôi đã viết ra một ví dụ nhỏ ở dưới đây. Tôi cố gắng để làm một cái gì đó như thế này và tôi tiếp tục nhận được lỗiLỗi độ sâu đệ quy khi sử dụng BeautifulSoup với bản đồ tổng hợp đa xử lý

'RuntimeError: độ sâu đệ quy tối đa vượt quá trong khi tẩy một đối tượng'

Edited Mã

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

Sau khi thực hiện một số tìm kiếm và đào bới thông qua một số bài viết, tôi đã biết rằng lỗi đang xảy ra vì BeautifulSoup vượt quá chiều sâu của ngăn xếp trình thông dịch python. Tôi đã cố gắng tăng giới hạn và chạy chương trình tương tự (tôi đã lên đến 3000) nhưng lỗi vẫn giữ nguyên. Tôi đã ngừng tăng giới hạn vì sự cố xảy ra với BeautifulSoup khi mở tệp html.

Sử dụng đa xử lý với BeautifulSoup sẽ tăng tốc thời gian thực hiện của tôi, nhưng tôi không thể tìm ra cách áp dụng nó để mở tệp.

Có ai có cách tiếp cận nào khác về cách sử dụng BeautifulSoup với đa xử lý hoặc cách truy cập các loại lỗi này không?

Bất kỳ loại trợ giúp nào sẽ được đánh giá cao, tôi đang ngồi hàng giờ cố gắng khắc phục và hiểu tại sao tôi gặp lỗi.

Sửa

Tôi đã thử nghiệm mã trên với các tập tin tôi đã đưa ra trong các đường dẫn và tôi đã nhận RuntimeError tương tự như trên

Các tập tin có thể được truy cập tại đây (http://ec2-23-20-166-224.compute-1.amazonaws.com/sites/html_files/)

+1

Đoạn mã trên không tạo ra lỗi bạn mô tả cho tôi. Bạn có thể dán tập lệnh đơn giản nhất mà bạn đã thực sự thử nghiệm và _does_ tạo lỗi này không? – senderle

+0

Xin chào, Cảm ơn bạn đã trả lời .. tôi vừa thử nghiệm mã với các trang html ở trên tôi đã đưa ra trong liên kết và tôi đã nhận được lỗi "RuntimeError: độ sâu đệ quy tối đa vượt quá khi đang tẩy một đối tượng" Cảm ơn bạn đã trợ giúp – kich

Trả lời

3

Tôi nghĩ lý do là sự trở lại của toàn bộ soup.title -object. Có vẻ như, tất cả các yếu tố childrenparent và con cái và cha mẹ của họ và như vậy được phân tích trong thời điểm này và điều này làm tăng lỗi đệ quy.

Nếu nội dung của đối tượng là những gì bạn cần, bạn chỉ có thể gọi str -method:

return soup.title.__str__() 

Thật không may, điều này có nghĩa, bạn không có quyền truy cập vào tất cả các thông tin khác được cung cấp bởi thư viện bs4 nữa.

Các vấn đề liên quan