0

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.

1
  • Note: beautifulsoup will only return the contents of a script element as text Commented Nov 10, 2021 at 16:39

1 Answer 1

2

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
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.