Obtenga datos de variables dentro de la etiqueta de script en Python o Contenido agregado de js

Quiero obtener datos de otra url para la que estoy usando urllib y Beautiful Soup , Mis datos están dentro de la etiqueta de la tabla (que he descubierto utilizando la consola de Firefox). Pero cuando intenté obtener una tabla usando su id, el resultado es Ninguno, entonces creo que esta tabla debe agregarse dinámicamente a través de algún código js.

He probado todos los analizadores ‘lxml’, ‘html5lib’ pero todavía no puedo obtener los datos de esa tabla.

También he intentado una cosa más:

web = urllib.urlopen("my url") html = web.read() soup = BeautifulSoup(html, 'lxml') js = soup.find("script") ss = js.prettify() print ss 

Resultado:

  myPage = 'ETFs'; sectionId = 'liQuotes'; //section tab breadCrumbId = 'qQuotes'; //page is_dartSite = "quotes"; is_dartZone = "news"; propVar = "ETFs";  

Pero ahora no sé cómo puedo obtener datos de estas variables js.

Ahora tengo dos opciones para obtener el contenido de la tabla o las variables js, cualquiera de ellas puede cumplir mi tarea, pero desafortunadamente no sé cómo obtenerlas, así que, por favor, díganme cómo puedo resolver cualquiera de los problemas. .

Gracias

EDITAR

Esto hará el truco usando re modulo para extraer los datos y cargarlos como JSON:

 import urllib import json import re from bs4 import BeautifulSoup web = urllib.urlopen("http://www.nasdaq.com/quotes/nasdaq-financial-100-stocks.aspx") soup = BeautifulSoup(web.read(), 'lxml') data = soup.find_all("script")[19].string p = re.compile('var table_body = (.*?);') m = p.match(data) stocks = json.loads(m.groups()[0]) >>> for stock in stocks: ... print stock ... [u'ASPS', u'Altisource Portfolio Solutions SA', 116.96, 2.2, 1.92, 86635, u'N', u'N'] [u'AGNC', u'American Capital Agency Corp.', 23.76, 0.13, 0.55, 3184303, u'N', u'N'] . . . [u'ZION', u'Zions Bancorporation', 29.79, 0.46, 1.57, 2154017, u'N', u'N'] 

El problema con esto es que el desplazamiento de la etiqueta del script está codificado y no hay una manera confiable de ubicarlo dentro de la página. Los cambios en la página podrían romper su código.

Respuesta original

En lugar de intentar raspar los datos en la pantalla, puede descargar una representación CSV de los mismos datos desde http://www.nasdaq.com/quotes/nasdaq-100-stocks.aspx?render=download .

Luego use el módulo csv de Python para analizarlo y procesarlo. Esto no solo es más conveniente, sino que será una solución más resistente, ya que cualquier cambio en el HTML podría romper fácilmente el código de raspado de la pantalla.

De lo contrario, si observa el HTML real, encontrará que los datos están disponibles dentro de la página en la siguiente etiqueta de script:

  

Solo para agregar a la respuesta de @mhawke, en lugar de codificar el offset de la etiqueta de script, recorre todas las tags de script y coincide con la que coincide con su patrón;

 web = urllib.urlopen("http://www.nasdaq.com/quotes/nasdaq-financial-100-stocks.aspx") pattern = re.compile('var table_body = (.*?);') soup = BeautifulSoup(web.read(), "lxml") scripts = soup.find_all('script') for script in scripts: if(pattern.match(str(script.string))): data = pattern.match(script.string) stock = json.loads(data.groups()[0]) print stock