2016-04-08 7 views
2

Normalerweise, wenn ich BeautifulSoup bin mit Daten zu extrahieren ein einfachesBeautiflsoup erstellen Suppe mit einem Snippet Seite Quelle

soup = BeautifulSoup(driver.page_source, "html5lib") 

Einfach. Job erledigt.

Aber ich habe es mit einer Seite zu tun, die eine Los Daten darauf hat. Es ist bereits geladen, also muss ich mir keine Gedanken über die Ladezeiten machen, aber ich denke, der wahre Mörder ist, dass meine find_alls Seitenquelle durchsucht wird, die ich nicht ansehen muss.

Ich weiß, ich kann die Daten eingrenzen, die ich suche, sobald ich die Suppe gemacht habe, indem ich zu der Klasse usw. navigiert habe. Und das funktioniert, aber es ist ziemlich langsam. Tatsächlich ist das Erstellen der Suppe mit der Quelle page_source ziemlich langsam.

Ich habe Variationen anprobiert

Suppe = BeautifulSoup (driver.find_element_by_class_name ('Box'), "html5lib")

Aber ohne Erfolg. Ist es möglich, so etwas zu tun, ohne den Quellcode durchzusehen? Ich denke, in irgendeiner Form müsste es immer noch die Quelle laden, um nur die Klasse zu finden, die ich sehen möchte. Aber eine kleinere Suppe kann schneller heruntergeladen werden, nachdem sie heruntergeladen wurde.

Ich würde jemanden schätzen, der mir hier in die richtige Richtung zeigen kann.

TL; DR meine Suppe von page_source ist riesig braucht Zeit Navigieren durch Selen kann ich meine Suppe auf einen bestimmten Klassennamen oder etwas vor dem Navigieren beschränken.

Antwort

2

Sicher, das ist genau das, was SoupStrainer ist ungefähr:

Die SoupStrainer Klasse können Sie auswählen, welche Teile eines eingehenden Dokuments analysiert werden.

Zum Beispiel, wenn Sie BeautifulSoup nur Elemente mit box Klasse analysieren wollen:

from bs4 import BeautifulSoup, SoupStrainer 

only_box = SoupStrainer(class_="box") 
BeautifulSoup(driver.page_source, "html5lib", parse_only=only_box) 

Als Randbemerkung, wenn die Geschwindigkeit wirklich wichtig ist, sollten Sie von html5lib zu lxml.html Parser Schalt:

BeautifulSoup(driver.page_source, "lxml", parse_only=only_box) 
+0

Ah perfekt! Du hast keine Ahnung, wie viel besser du heute Abend mein Leben gemacht hast. Und ich gebe lxml, aber es neigt dazu, Dinge zu verpassen, die html5lib zu übernehmen scheint. – PoweredByCoffee