2016-04-21 18 views
2

BlogからSeleniumまで動的コンテンツをスクラップしようとしていますが、レンダリングされていないJavaScriptが返されます。Seleniumによる動的コンテンツのスクラップ?

この動作をテストするために、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'メソッドの1つを使って要素を選択しようとしましたか? – DuckPuncher

答えて

3

を印刷することができるよこれで何かを探しています - the .page_source works only in the current context"current top-level browsing context"という表記法があります。デフォルトのコンテンツで呼び出す場合は、iframe要素の内部HTMLを取得しません。そのためには、frameのコンテキストに切り替えて.page_sourceと呼び出す必要があります。

つまり、iframeのページソースを含むページの完全なHTMLを取得するには、iframeコンテキストに1つずつ切り替えて別々にソースを取得する必要があります。

も参照してください:


は旧答え:

私は少なくとも一つのブログエントリは負荷があることを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コンテンツです。 –

関連する問題