2017-02-01 7 views
1

Ich habe gelesen, dass Javascript zu kratzen die rohe HTML zu rendern, muss ich Selen und ein Webdriver wie phantomjs verwenden. Das macht aber immer noch nicht die Javascripts für mich. Unten ist ein Beispielskript.Python, Selen: nicht in der Lage, roh html von Javascript

Jeder?

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

Was ist das Ergebnis Ihrer Skriptausführung? Haben Sie versucht, 'Chrome' oder' Firefox' zu verwenden, um die Ausführung zu visualisieren? – Andersson

+0

Nun, ich habe gerade versucht, nach einem Text wie 'Total Revenue' zu suchen, aber keinen. Alle von ihnen sind nur in Javascript, die ich nicht wirklich verstehe. Ich benutze PhantomJS, nicht Chrome oder Firefox Webdriver. Davon abgesehen, habe ich auch versucht, Chrome-Treiber und das Ergebnis ist genau das gleiche – Jake

Antwort

1

Seiteninhalt, wie Sie erwähnt haben, von JavaScript Code generiert wird, so dass Sie es nicht in erster Seite Quelle zu finden sein können und das Hinzufügen von selbst time.sleep(3) konnte nicht genug sein ... Sie müssen Warten Sie einige Zeit, bis die erforderlichen Daten auf der Seite vorhanden sind. Versuchen Sie unter Code zu verwenden:

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 

Mit diesem Code, den Sie auf 10 Sekunden warten, bis werden (Sie können Timeout erhöhen, wenn Sie benötigen), bis sie benötigt table Element Präsenz. Wenn es nicht innerhalb von 10 Sekunden gerendert wird, erhalten Sie TimeOutException

+0

Hallo Andersson, danke ~ Ich habe versucht, Ihre Methode, aber es nur Timeout egal zu welcher Zeit gab ich. Der Code scheint mit time.sleep identisch zu sein. Wenn er das fragliche Element nicht erkennen kann, wird es Timeout. Das Javascript wurde jedoch immer noch nicht geladen. Neugierig, wenn Sie mit diesem Skript ein erfolgreiches Ergebnis erzielt haben? – Jake

+0

Ich habe 'iframe' nicht bemerkt .. Jetzt sollte es funktionieren. Überprüfen Sie den aktualisierten Code – Andersson

+0

Es tut in der Tat. Vielen Dank! Darf ich fragen, warum time.sleep nicht funktioniert? Selbst wenn ich es auf 60sec ~ – Jake

Verwandte Themen