2017-02-01 11 views
1

私は、生のHTMLをスクラップするためにjavascriptをレンダリングするために、私はセレンとphantomjsのようなwebdriverを使用する必要があります。しかし、そうすることは、私のためにjavascriptをレンダリングしません。以下はサンプルスクリプトです。python、selenium:javascriptから生のhtmlを取得できません

誰でも?あなたが言及したよう

from selenium import webdriver 
import time 

url="http://www.sgx.com/wps/portal/sgxweb/home/company_disclosure/stockfacts?page=2&code=5TG&lang=en-us" 
PJ = r'/xxx/MyPythonScripts/phantomjs_mac' 

driver = webdriver.PhantomJS(PJ) 
driver.get(url) 
time.sleep(3) 
html=driver.page_source.encode('utf-8') 
print html 
+0

スクリプト実行の結果はどうなりますか?実行を視覚化するために 'Chrome'や' Firefox'を使用しようとしましたか? – Andersson

+0

まあ、私は 'Total Revenue'のようなテキストを探してみました。それらのすべては私が本当に理解していないJavascriptでちょうどある。私はPhantomJSを使用していますが、ChromeやFirefoxのwebdriversは使用していません。それは言われて、私はまた、Chromeのドライバを試して、結果はまったく同じです – Jake

答えて

1

ページのコンテンツは、JavaScriptコードによって生成されるので、あなたは十分でない可能性があり、最初のページのソースにもtime.sleep(3)を追加し、それを見つけることができません...あなたがする必要があり必要なデータがページに表示されるまでしばらくお待ちください。コードの下に使用してみてください:このコードで

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

url="http://www.sgx.com/wps/portal/sgxweb/home/company_disclosure/stockfacts?page=2&code=5TG&lang=en-us" 
PJ = r'/xxx/MyPythonScripts/phantomjs_mac' 

driver = webdriver.PhantomJS(PJ) 
driver.get(url) 

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,'//div[starts-with(@id, "mainns_")]/iframe'))) 
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//div[@class="data-point-container section-break"]/table'))) 

html = driver.page_source 
assert "Total Revenue" in html 

、必要なtable要素の存在まで(あなたが必要な場合は、タイムアウトを増やすことができます)10秒まで待機します。 10秒以内にレンダリングされない場合は、TimeOutException

+0

こんにちはアンダーソン、おかげ〜私はあなたの方法を試みたが、それはちょうど私が与えた時間に関係なくタイムアウトです。コードはtime.sleepと同じように見えますが、問題の要素を検出できない場合はタイムアウトになります。しかし、Javascriptはまだ読み込まれませんでした。そのスクリプトを使用して成功した場合、興味がありますか? – Jake

+0

私は 'iframe'に気付かなかった。今はうまくいくはずだ。更新されたコードを確認してください – Andersson

+0

確かにそうです。ありがとう!なぜtime.sleepがうまくいかないのか聞かせてもらえますか? iframeに60sec〜 – Jake

関連する問題