¿Por qué urllib.urlopen.read () no corresponde al código fuente?

Estoy tratando de obtener la siguiente página web:

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

El resultado no se corresponde con lo que veo al inspeccionar el código fuente de la página web con Google Chrome, por ejemplo.

¿Podría decirme por qué sucede esto y cómo podría mejorar mi código para superar el problema?

Gracias por tu ayuda.

Lo que está obteniendo de urlopen es la página web sin urlopen lo que significa que no se ejecuta javascript. urlopen no se usa; donde lo que obtienes de Chrome (u otros navegadores) es la página web final que incluye javascript ejecutable (que podría alterar el HTML), css, etc., todo lo cual no ocurre en urlopen

De ahí la diferencia, espero que esto quede claro.

Puedes usar Python Selenium para resolver tu problema. Aquí hay un código de ejemplo echar un vistazo.

 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 

Luego, debido a su rest de trabajo según su elección, un ejemplo más con la instancia del navegador

 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() 

Puede usar Selenium con Firefox para resolver el problema, pero puede que no sea adecuado en muchos casos, ya que el navegador aparece cada vez que ejecuta el código. Otra idea es usar una brida sin cabeza como PhantomJS.

La mejor manera para esto es usar la biblioteca mecanizar. Instalar mecanizar via pip.

 pip install mechanize 

Luego puedes usar el siguiente código:

 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 

También proporciona la opción para el sueño y la ejecución de scripts. Puedes leerlos en la documentación.

Además, algunos sitios web tienen el llamado cambio de navegador, lo que podría llevar a que se muestren diferentes fonts cuando se usan diferentes navegadores (por ejemplo, mostrar una versión liviana para navegadores móviles).

Eche un vistazo a http://www.diveintopython.net/http_web_services/user_agent.html sobre cómo cambiar User-Agent a algo como “Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.1 (KHTML, como Gecko) Chrome / 21.0.1180.89 Safari / 537.1 “(que en realidad es mi User-Agent).

Parece que desea una biblioteca que pueda actuar como un navegador y ejecutar el javascript para usted, luego darle el código fuente resultante. Windmill debería poder hacer esto por ti. ( http://www.getwindmill.com/ )

Hay un buen artículo sobre cómo usarlo para lo que quiere aquí:
http://www.packtpub.com/article/web-scraping-with-python