Cómo evitar una redirección “oculta” con urlopen () en Python

Estoy usando BeautifulSoup para el rastreo web y tengo problemas con un tipo particular de sitio web cuando uso urlopen . Cada artículo en el sitio web tiene su propia página única y el artículo viene en diferentes formatos (por ejemplo, 500 ml, 1L, 2L, … ).

Cuando abro la URL del producto ( www.example.com/product1 ) usando mi navegador de Internet, vería una imagen del formato de 500 ml, información sobre el mismo ( precio, cantidad, sabor, etc. ) y una lista de Todos los otros formatos disponibles para este artículo específico. Si se hace clic en otro formato (por ejemplo, 1L ), la imagen y la información sobre el elemento cambiarán, pero la URL en la parte superior de mi navegador permanecerá igual ( www.example.com/product1 ). Sin embargo, al inspeccionar el código HTML de la página, sé que todos los formatos tienen su propia URL única ( 500 ml: www.example.com/product1/123; 1L: www.example.com/product1/456, … ). Al usar la URL única del formato 1L en mi navegador de Internet, se me redirige automáticamente a la página www.example.com/product1, pero la imagen y la información que se muestra en la página corresponde al formato 1L. El código HTML también contiene la información que necesito sobre el formato 1L.

Mi problema surge cuando uso urlopen para abrir estas URL únicas.

from bs4 import BeautifulSoup from urllib import urlopen webpage = urlopen('www.example.com/product1/456') soup=BeautifulSoup(webpage) print soup 

La información contenida en la sopa no corresponde a la información mostrada con mi navegador de Internet para la URL única: www.example.com/product1/456 . Me da la información sobre el formato del elemento que se muestra de forma predeterminada en www.example.com/product1, que siempre es el formato de 500 ml.

¿Hay alguna manera de evitar esta redirección que me permita capturar con BeautifulSoup la información contenida en el código HTML de las URL únicas?

 import urllib2 class RedirectHandler(urllib2.HTTPRedirectHandler): def http_error_302(self, req, fp, code, msg, headers): result = urllib2.HTTPError(req.get_full_url(), code, msg, headers, fp) result.status = code return result http_error_301 = http_error_303 = http_error_307 = http_error_302 opener = urllib2.build_opener(RedirectHandler()) webpage = opener.open('http://www.example.com/product1/456') ...