Beautifulsoup y problema de la mesa AJAX

Estoy haciendo un guión que raspa los juegos de la base de datos Team Liquid de los juegos internacionales de StarCraft 2. (http://www.teamliquid.net/tlpd/sc2-international/games)

Sin embargo yo vengo por un problema. Tengo mi script recorriendo todas las páginas, sin embargo, el sitio de Team Liquid utiliza algún tipo de AJAX que pienso en la tabla para actualizarlo. Ahora cuando uso BeautifulSoup no puedo obtener los datos correctos.

Así que recorro estas páginas:

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-1-1-DESC

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-2-1-DESC

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-3-1-DESC

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-4-1-DESC etc …

Cuando abres estas páginas, ves diferentes páginas, sin embargo, mi script sigue recibiendo la misma primera página cada vez. Creo que esto se debe a que al abrir las otras páginas, se ve algo de carga durante un poco de tiempo al actualizar la mesa con los juegos a la página correcta. Así que supongo que beatifulsoup es muy rápido y debe esperar a que se cargue y actualice la tabla.

Entonces mi pregunta es: ¿Cómo puedo asegurarme de que tome la tabla actualizada?

Ahora uso este código para obtener los contenidos de la tabla, después de lo cual puse los contenidos en un archivo .csv:

html = urlopen(url).read().lower() bs = BeautifulSoup(html) table = bs.find(lambda tag: tag.name=='table' and tag.has_key('id') and tag['id']=="tblt_table") rows = table.findAll(lambda tag: tag.name=='tr') 

Cuando intenta desechar un sitio usando AJAX, es mejor ver qué hace realmente el código javascript. En muchos casos, simplemente recupera XML o HTML, lo que sería incluso más fácil de eliminar que el contenido no AJAXy. Solo requiere mirar algún código fuente.

En su caso, el sitio recupera el código HTML para el control de la tabla por sí mismo (en lugar de actualizar toda la página) desde una URL especial y lo reemplaza dinámicamente en el DOM del navegador. Mirando http://www.teamliquid.net/tlpd/tabulator/ajax.js , verías que esta URL tiene el siguiente formato:

http://www.teamliquid.net/tlpd/tabulator/update.php?tabulator_id=1811& tabulator_page = 1 & tabulator_order_col = 1 & tabulator_order_desc = 1 & tabulator_Search & tabulator_search =

Así que todo lo que necesita hacer es raspar esta URL directamente con BeautifulSoup y avanzar el contador de tabulator_page cada vez que desee la página siguiente.

No puedes con solo BeautifulSoup; no ejecuta javascript para ti.

Es posible que tenga más suerte con el selenium , asumiendo que no desea intentar analizar el javascript relevante y realizar las llamadas que AJAX estaría haciendo para obtener los datos.

Para los sitios con contenido dynamic a través de AJAX y Javascript, he utilizado PhantomJS . No requiere abrir un navegador porque es, en sí mismo, un navegador web completamente compatible con scripts. PhantomJS es rápido e incluye soporte nativo para varios estándares web como manejo de DOM, selector de CSS, JSON y Canvas.

Si no eres un Ninja de JavaScript, deberías mirar CasperJS , está escrito sobre PhantomJS. Facilita el proceso de definir un escenario de navegación completo y proporciona funciones útiles de alto nivel.

Aquí un ejemplo sobre cómo funciona CasperJS:

CasperJs y Jquery con selecciones encadenadas

Parece que la causa de su problema es que ni BeautifulSoup ni urllib podrán ejecutar el javascript dentro de la página.

Tal vez, deberías usar selenium para abrir la página en un navegador real, luego extraer el html cuando esté listo y analizarlo con BeautifulSoup.