2016-04-21 10 views
2

Ich versuche, dynamischen Inhalt von einem Blog durch Selenium zu verwerfen, aber es gibt immer un gerenderten JavaScript zurück.Scrapping dynamischer Inhalt durch Selen?

Um dieses Verhalten zu testen, habe ich versucht zu warten, bis Iframe vollständig geladen und gedruckt seinen Inhalt, der gut druckt, aber wieder wenn ich zurück zum übergeordneten Frame zeigt es nur un gerenderten JavaScript.

Ich suche nach etwas, in dem ich in der Lage vollständig gerenderte HTML-Inhalt

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions 

driver = webdriver.Chrome("path to chrome driver") 
driver.get('http://justgivemechocolateandnobodygetshurt.blogspot.com/') 

WebDriverWait(driver, 40).until(expected_conditions.frame_to_be_available_and_switch_to_it((By.ID, "navbar-iframe"))) 

# Rendered iframe HTML is printed. 
content = driver.page_source 
print content.encode("utf-8") 

# When I switch back to parent frame it again prints non rendered JavaScript. 
driver.switch_to.parent_frame() 
content = driver.page_source 
print content.encode("utf-8") 
+0

weil '.page_source' die Quelle zurückkehrt, wie die DOM – Fabricator

+0

@Fabricator nicht kann ich die aktualisierte DOM erhalten: ed bevor die page_source bekommen? –

+0

@UmarIqbal, Haben Sie versucht, das Element mit einer der Methoden 'find_element' auszuwählen? – DuckPuncher

Antwort

3

Das Problem ist, drucken - the .page_source works only in the current context. Es gibt diese "current top-level browsing context" Notation..Mitteilung, wenn Sie es auf einem Standardinhalt nennen würden - Sie würden nicht den inneren HTML des Kindes iframe Elemente erhalten - dafür müssten Sie in den Kontext eines frame umschalten und .page_source anrufen.

Mit anderen Worten, um den vollständigen HTML-Code der Seite einschließlich der Seitenquelle der Iframes zu erhalten, müssten Sie einzeln in die iframe-Kontexte wechseln und die Quellen separat beziehen.

Siehe auch:


Alte Antwort:

Ich würde wait für mindestens einen Blogeintrag sein Last

from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

wait = WebDriverWait(driver, 40) 
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".entry-content"))) 

print(driver.page_source) 
+0

Egal, gibt immer noch das alte DOM zurück. –

+0

@UmarIqbal okay, was meinst du mit dem alten DOM? Und was ist Ihre gewünschte Ausgabe? – alecxe

+0

von alten DOM Ich meinte un gerenderten JavaScript. Alles, was ich will, ist ein komplett gerenderter HTML-Inhalt. –