Home > Mobile >  Python: Download list of CSVs inside of javascript script in web
Python: Download list of CSVs inside of javascript script in web

Time:11-11

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
  • Related