2016-04-21 107 views
2

我试图通过Selenium从Blog中取消动态内容,但它总是返回未呈现的JavaScript。通过硒刮动态内容?

为了测试这种行为,我试图等到iframe完全加载并打印它的打印质量很好的内容,但是当我移回到父框架时它只显示未呈现的JavaScript。

我在寻找中,我能打印完全呈现HTML内容

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

因为'.page_source'返回源,而不是DOM – Fabricator

+0

@Fabricator我怎样才能得到更新的DOM? –

+0

@UmarIqbal,您是否尝试过使用'find_element'方法之一选择元素? – DuckPuncher

回答

3

的问题是什么 - the .page_source works only in the current context。有"current top-level browsing context"表示法。如果你打算在默认内容上调用它 - 你不会得到子元素iframe的内部HTML - 因为你必须切换到frame的上下文中,并且调用.page_source

换句话说,要获得页面非常完整的HTML(包括iframe的页面源代码),您必须逐个切换到iframe上下文,并分别获取源代码。

参见:


老答案:

我会wait至少一个博客条目进行负载编辑得到page_source前:

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

无所谓,仍旧返回旧的DOM。 –

+0

@UmarIqbal没关系,你是什么意思的旧DOM?你期望的输出是什么?旧DOM的 – alecxe

+0

我的意思是未呈现的JavaScript。我只想要一个完全呈现的HTML内容。 –