Quiero descargar una lista de csv con un script de python.
http://meteo.navarra.es/estaciones/descargardatos_estacion.cfm?IDEstacion=251
He usado este código para localizar las URL del archivo.
import urllib.request as urllib2 from bs4 import BeautifulSoup # Fetch URL url = 'http://meteo.navarra.es/estaciones/descargardatos_estacion.cfm? IDEstacion=251' request = urllib2.Request(url) request.add_header('Accept-Encoding', 'utf-8') # Response has UTF-8 charset header, # and HTML body which is UTF-8 encoded response = urllib2.urlopen(request) # Parse with BeautifulSoup soup = BeautifulSoup(response,"html.parser") print(soup)Esas URL de CSV están dentro de un script de javascripts
<script type="text/javascript"> <!-- var d = new dTree('d'); d.add(0,-1,'<b>Ficheros de datos</b>'); d.add(1,0,'AncÃn INTIA','','','','/js/dtree/img/folder.gif'); d.add(10,1,'Datos diarios','','','','/js/dtree/img/folder.gif'); d.add(1000,10,'AncÃn INTIA_2001.csv','/_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2001.csv'); d.add(1001,10,'AncÃn INTIA_2002.csv','/_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2002.csv'); d.add(1002,10,'AncÃn INTIA_2003.csv','/_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2003.csv'); d.add(1003,10,'AncÃn INTIA_2004.csv','/_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2004.csv'); -->Intenté usar request y sopa para encontrar el dTree, pero no puedo acceder a los atributos del árbol.
beautifulsoup solo devolverá el contenido de un elemento de secuencia de comandos como texto, deberá extraer las entradas usted mismo desde adentro. Esto podría hacerse usando una expresión regular para extraer las líneas .add . Cada línea de texto podría convertirse en una lista de Python usando literal_eval y luego podría tomar el último elemento.
Por ejemplo:
import urllib.request as urllib2 from bs4 import BeautifulSoup import re from ast import literal_eval # Fetch URL url = 'http://meteo.navarra.es/estaciones/descargardatos_estacion.cfm?IDEstacion=251' request = urllib2.Request(url) request.add_header('Accept-Encoding', 'utf-8') # Response has UTF-8 charset header, and HTML body which is UTF-8 encoded response = urllib2.urlopen(request) # Parse with BeautifulSoup soup = BeautifulSoup(response,"html.parser") re_add = re.compile("add\((.*?\.csv')\);") csv_files = [] for script in soup.find_all('script', type="text/javascript"): if script.string and '.csv' in script.string: for entry in re_add.findall(script.string): csv_files.append(literal_eval(f'[{entry}]')[-1]) print('\n'.join(csv_files))Dándote entradas:
/_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2001.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2002.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2003.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2004.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2005.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2006.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2007.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2008.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2009.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2010.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2011.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2012.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2013.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2014.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2015.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2016.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2017.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2018.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2019.csv /_data/datos_estaciones/estacion_251/datos diarios/ancÃn intia_2020.csv