2012-01-22 13 views
24

Vorrei scaricare la pagina Web generata da Javascript e memorizzarla nella variabile stringa nel codice Python. La pagina viene generata quando si fa clic sul pulsante.Ottieni pagina generata con Javascript in Python

Se vorrei conoscere l'URL risultante, userei urllib2 ma questo non è il caso.

ringraziamento

+0

È questo generato completamente in js o semplicemente costruito da una chiamata AJAX? –

+0

@ e-satis Penso che sia completamente in js – xralf

+0

Poi ho avuto con la soluzione J.F, o con python webkit. Tieni a mente che richiedono l'esecuzione di un server di visualizzazione, quindi se hai intenzione di eseguirlo su un server headless, dovrai eseguire un pochino di hacking. –

risposta

34

Si potrebbe utilizzare Selenium Webdriver:

#!/usr/bin/env python 
from contextlib import closing 
from selenium.webdriver import Firefox # pip install selenium 
from selenium.webdriver.support.ui import WebDriverWait 

# use firefox to get page with javascript generated content 
with closing(Firefox()) as browser: 
    browser.get(url) 
    button = browser.find_element_by_name('button') 
    button.click() 
    # wait for the page to load 
    WebDriverWait(browser, timeout=10).until(
     lambda x: x.find_element_by_id('someId_that_must_be_on_new_page')) 
    # store it to string variable 
    page_source = browser.page_source 
print(page_source) 
+3

è il 'WebDriverWait' con' someId_that_must_be_on_new_page' necessario? Potrebbe essere fatto solo con alcune funzioni 'sleep' o' delay'? Ed è possibile impostare la stringa user-agent? – xralf

+0

C'è ancora un problema. Sulla pagina web c'è l'elemento 'select' e qualcosa deve essere selezionato. Se non viene selezionato nulla, il pulsante non funzionerà. Ed è necessario aprire e chiudere Firefox? Senza 'guit' questo non funzionerà? – xralf

+0

potresti utilizzare qualsiasi condizione che ti piace ad es., 'X.title == 'Nuovo titolo''. Probabilmente potresti modificare user-agent usando il profilo firefox appropriato. – jfs

Problemi correlati