2012-04-29 12 views
8

Używam BeautifulSoup do parsowania plików html, podczas gdy wszystkie napisane przeze mnie skrypty działają dobrze, ale wolno. Eksperymentuję więc nad wykorzystaniem wieloprocesowej puli pracowników wraz z BeautifulSoup, aby mój program działał szybciej (mam do otwierania około 100 000 - 1 000 000 plików HTML). Scenariusz, który napisałem, jest bardziej złożony, ale tutaj zapisałem mały przykład. Staram się zrobić coś takiego i wciąż otrzymuję błądBłąd głębi rekursji podczas korzystania z BeautifulSoup z wieloprocesową mapą puli

„RuntimeError: Maksymalna głębokość rekursji przekroczone podczas trawienia obiektu”

kod edytowany

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

Po wykonaniu niektórych przeszukując i przekopując się przez niektóre posty, dowiedziałem się, że błąd występuje, ponieważ BeautifulSoup przekracza głębokość stosu interpretera Pythona. Próbowałem podnieść limit i uruchomić ten sam program (poszedłem do 3000), ale błąd pozostaje taki sam. Przestałem podnosić limit, ponieważ problem dotyczy programu BeautifulSoup podczas otwierania plików HTML.

Korzystanie z wieloprocesowości w BeautifulSoup przyspieszy mój czas wykonania, ale nie jestem w stanie wymyślić, jak zastosować go do otwierania plików.

Czy ktoś ma jakieś inne podejście do korzystania z BeautifulSoup przy wieloprocesowym przetwarzaniu lub jak znaleźć takie błędy?

Każdy rodzaj pomocy zostanie doceniony, siedzę całymi godzinami próbując to naprawić i rozumiem, dlaczego otrzymuję błąd.

Edit

Testowałem powyższy kod z plikami dałem w ścieżkach i mam ten sam RuntimeError jak wyżej

mogą być dostępne tutaj Pliki (http://ec2-23-20-166-224.compute-1.amazonaws.com/sites/html_files/)

+1

Powyższy skrypt nie generuje błędu, który mi opisałeś. Czy możesz wkleić najprostszy skrypt, który faktycznie przetestowałeś, i że ten błąd jest generowany? – senderle

+0

Witam, dzięki za odpowiedź..i właśnie przetestowałem kod z powyższymi stronami html podanymi w linku i mam błąd "RuntimeError: przekroczono maksymalną głębokość rekursji podczas wytrawiania obiektu" Dzięki za pomoc – kich

Odpowiedz

3

Myślę, że powodem jest powrót całego obiektu - soup.title. Wygląda na to, że wszystkie elementy i ich dzieci i rodzice są analizowane w tym momencie, a to powoduje błąd rekursji.

Jeśli zawartość obiektu jest to, co trzeba, można po prostu zadzwonić do str metoda:

return soup.title.__str__() 

Niestety, oznacza to, że nie mają dostępu do wszystkich innych informacji dostarczonych przez bibliotekę bs4.

Powiązane problemy