2012-09-17 12 views
12

sto cercando di prendere la seguente pagina web:Perché urllib.urlopen.read() non corrisponde al codice sorgente?

import urllib 
urllib.urlopen("http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1").read() 

Il risultato non corrisponde a quello che vedo quando si ispeziona il codice sorgente della pagina web utilizzando Google Chrome per esempio.

Potrebbe dirmi perché questo succede e come posso migliorare il mio codice per superare il problema?

Grazie per il vostro aiuto.

+1

Quali sono le differenze? –

+0

Ciao, urllib.urlopen.read() mi dà per esempio nel corpo: ' \ n

\ n' che è un'informazione troppo piccola riguardo a cosa c'è nella pagina. –

+0

Vedi la risposta di Srikar.La pagina è generata dinamicamente usando javascript. La chiave è in "Album1.EcritElement (0)". –

risposta

10

Quello che si ottiene da urlopen è la pagina Web raw che significa che non viene eseguito javascript css non viene utilizzato; dove come quello che ottieni da Chrome (o altri browser) è la pagina finale che includeva javascript eseguibile (che potrebbe alterare l'HTML), css rendering ecc. Tutto ciò non avviene in urlopen ...

Quindi la differenza, Spero che questo sia chiaro

+0

La visualizzazione * di origine * di Chrome cambia quando il DOM viene manipolato? Quello di Firefox no. – delnan

+2

@delnan l'OP non dice esplicitamente che sta usando View Source (che non cambia) piuttosto che Inspect Element (che lo fa). –

+0

@SrikarThanks che cosa dovrei usare al posto di urlopen per avere la pagina web finale analizzata? –

3

Inoltre, alcuni siti Web hanno un cosiddetto switch del browser che potrebbe portare a una diversa sorgente che viene mostrata quando si utilizzano browser diversi (ad esempio, mostrare una versione leggera per i browser mobili).

Date un'occhiata a http://www.diveintopython.net/http_web_services/user_agent.html su come modificare l'User-Agent su qualcosa come "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, come Gecko) Chrome/21.0.1180.89 Safari/537.1" (che in realtà è il mio utente-agente).

9

è possibile utilizzare Python Selenium per risolvere il problema. Ecco un esempio di codice dare un'occhiata.

from selenium import webdriverr 
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1" 
browser = webdriver.Firefox() 
browser.get(url) 
sleep(10) 
all_body_id_html = browser.find_element_by_id('body') # you can also get all html 

Poi a causa vostra resto del lavoro secondo la vostra scelta qualche altro esempio con istanza del browser

def login(user='ssdf', password="cisin123"): 
content = browser.find_element_by_id('content') 
content.find_element_by_xpath('.//tbody/tr[2]//input[contains(@class,"textbox")]').send_keys(user) 
content.find_element_by_xpath('.//tbody/tr[3]//input[contains(@class,"textbox")]').send_keys(password) 
content.find_element_by_css_selector(".button").click() 
+1

sebbene l'altro commento risponda alla domanda di base "perché?", Solo questa risposta spiega come risolvere il problema reale. – rbp

6

è possibile utilizzare Selenio con Firefox per risolvere il problema, ma potrebbe non essere adatto in molti casi mentre il browser si apre ogni volta che si esegue il codice. Un'altra idea è usare un broswer senza testa come PhantomJS.

Il modo migliore è utilizzare la libreria mechanize. Installa meccanizza via pip.

pip install mechanize 

quindi è possibile utilizzare il seguente codice:

import mechanize 

mb = mechanize.Browser() 
mb.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
mb.set_handle_robots(False) 
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1" 
response = mb.open(url).read() 
print response 

Esso prevede anche l'opzione per gli script di sonno e l'esecuzione. Li puoi leggere nello documentation.