I want to download a list of csv with a python script.
http://meteo.navarra.es/estaciones/descargardatos_estacion.cfm?IDEstacion=251
I've used this code to locate the file urls
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)
Those CSVs urls are inside a javascripts script
<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');
-->
I've tried to use request and soup to find the dTree but i cant get to access the tree attributes.
CodePudding user response:
beautifulsoup will only return the contents of a script element as text, you will need to extract the entries yourself from inside. This could be done using a regular expression to extract the .add
lines. Each text line could be converted into a Python list using literal_eval
and then you could take the last element.
For example:
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))
Giving you entries:
/_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