Home > other >  Scraping data in "var" within <script> from a webpage
Scraping data in "var" within <script> from a webpage

Time:12-02

I am trying to scrape data from this website. To be specific, I want to scrape all the data from the following:

var bilancio_tree = [{"slug": "pcox-quadro-2-11", "label": "Totale generale delle Entrate", "values": [{"2021": {"abs": 1659238.91, "pc": 3463.96432150313}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}], "children": []}, {"slug": "pcox-quadro-2-2", "label": "Entrate correnti di natura tributaria, contributiva e perequativa", "values": [{"2021": {"abs": 618720.93, "pc": 1291.69296450939}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}], "children": [{"slug": "pcox-quadro-2-2-16", "label": "Imposte,tasse e proventi assimilati", "values": [{"2021": {"abs": 461222.66, "pc": 962.886555323591}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-2-31", "label": "Compartecipazioni di tributi", "values": [{"2021": {"abs": 2231.31, "pc": 4.65826722338205}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-2-41", "label": "Fondi perequativi da Amministrazioni Centrali", "values": [{"2021": {"abs": 155266.96, "pc": 324.148141962422}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-2-51", "label": "Fondi perequativi dalla Regione o Provincia autonoma", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}]}, {"slug": "pcox-quadro-2-3", "label": "Trasferimenti correnti", "values": [{"2021": {"abs": 114907.44, "pc": 239.890271398747}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}], "children": [{"slug": "pcox-quadro-2-3-71", "label": "Trasferimenti correnti da Amministrazioni pubbliche -", "values": [{"2021": {"abs": 91755.54, "pc": 191.556450939457}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-3-81", "label": "Trasferimenti correnti da Famiglie", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-3-91", "label": "Trasferimenti correnti da Imprese", "values": [{"2021": {"abs": 23151.9, "pc": 48.3338204592902}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-3-101", "label": "Trasferimenti correnti da Istituzioni Sociali Private", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-3-111", "label": "Trasferimenti correnti dall'Unione europea e dal Resto del Mondo- previsione di cassa", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}]}, {"slug": "pcox-quadro-2-4", "label": "Entrate extratributarie", "values": [{"2021": {"abs": 98243.25, "pc": 205.100730688935}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}], "children": [{"slug": "pcox-quadro-2-4-131", "label": "Vendita di beni e servizi e proventi derivanti dalla gestione dei beni", "values": [{"2021": {"abs": 84043.78, "pc": 175.456743215031}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-4-141", "label": "Proventi derivanti dall'attivit\u00e0 di controllo e repressione delle irregolarit\u00e0 e degli illeciti", "values": [{"2021": {"abs": 1000.0, "pc": 2.08768267223382}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-4-151", "label": "Interessi attivi", "values": [{"2021": {"abs": 100.0, "pc": 0.208768267223382}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-4-161", "label": "Altre entrate da redditi da capitale", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-4-171", "label": "Rimborsi e altre entrate correnti", "values": [{"2021": {"abs": 13099.47, "pc": 27.3475365344468}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}]}, {"slug": "pcox-quadro-2-5", "label": "Entrate in conto capitale", "values": [{"2021": {"abs": 451082.56, "pc": 941.717244258873}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}], "children": [{"slug": "pcox-quadro-2-5-191", "label": "Tributi in conto capitale", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-5-201", "label": "Contributi agli investimenti", "values": [{"2021": {"abs": 316616.62, "pc": 660.99503131524}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-5-211", "label": "Altri trasferimenti in conto capitale", "values": [{"2021": {"abs": 123965.94, "pc": 258.801544885177}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-5-221", "label": "Entrate da alienazione di beni materiali e immateriali", "values": [{"2021": {"abs": 8500.0, "pc": 17.7453027139875}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-5-231", "label": "Altre entrate in conto capitale", "values": [{"2021": {"abs": 2000.0, "pc": 4.17536534446764}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}]}, {"slug": "pcox-quadro-2-6", "label": "Entrate da riduzione di attivita\u0300 finanziarie", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}], "children": [{"slug": "pcox-quadro-2-6-251", "label": "Alienazione di attivit\u00e0 finanziarie", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-6-261", "label": "Riscossione crediti di breve termine", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-6-266", "label": "Riscossione crediti di medio", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-6-271", "label": "Altre entrate per riduzione di attivit\u00e0 finanziarie", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}]}, {"slug": "pcox-quadro-2-7", "label": "Accensione prestiti", "values": [{"2021": {"abs": 522.42, "pc": 1.09064718162839}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}], "children": [{"slug": "pcox-quadro-2-7-291", "label": "Emissione di titoli obbligazionari", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-7-301", "label": "Accensione prestiti a breve termine", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-7-311", "label": "Accensione mutui e altri finanziamenti a medio lungo termine", "values": [{"2021": {"abs": 522.42, "pc": 1.09064718162839}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-7-321", "label": "Altre forme di indebitamento", "values": [{"2021": {"abs": 0.0, "pc": 0.0}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}]}, {"slug": "pcox-quadro-2-8", "label": "Anticipazioni da istituto tesoriere/cassiere", "values": [{"2021": {"abs": 100000.0, "pc": 208.768267223382}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}], "children": [{"slug": "pcox-quadro-2-8-336", "label": "Anticipazione da istituto tesoriere/cassiere", "values": [{"2021": {"abs": 100000.0, "pc": 208.768267223382}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}]}, {"slug": "pcox-quadro-2-9", "label": "Entrate per conto terzi e partite di giro", "values": [{"2021": {"abs": 275762.31, "pc": 575.704196242171}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}], "children": [{"slug": "pcox-quadro-2-9-351", "label": "Entrate per partite di giro", "values": [{"2021": {"abs": 200719.26, "pc": 419.038121085595}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}, {"slug": "pcox-quadro-2-9-361", "label": "Entrate per conto terzi", "values": [{"2021": {"abs": 75043.05, "pc": 156.666075156576}}, {"2022": {"abs": 0.0, "pc": 0.0}}, {"2023": {"abs": 0.0, "pc": 0.0}}]}]}];
        

I am trying to build a dataset of the following form (with all the variables listed above):

Totale generale delle Entrate Total Totale generale delle Entrate PC
1659238.91 3463.96

Right now, I have the following script:

import requests
from bs4 import BeautifulSoup
import csv
import json
import re
   
URL = "https://openbilanci.it/armonizzati/bilanci/veglio-comune-bi/entrate/dettaglio?year=2021&type=preventivo"
r = requests.get(URL)  
   
soup = BeautifulSoup(r.content, 'html.parser')
   
data  = soup.find_all("script")[19].string
p = re.compile('var bilancio_tree = (.*?);')

m = p.match(data)

stocks = json.loads(m.groups()[0])

for stock in stocks:
    print(stock)

But, it's not working. I'm new to using python for web scraping, any help would be much appreciated!

CodePudding user response:

Try:

import re
import json
import requests
import pandas as pd


URL = "https://openbilanci.it/armonizzati/bilanci/veglio-comune-bi/entrate/dettaglio?year=2021&type=preventivo"
r = requests.get(URL)

p = re.compile("var bilancio_tree = (.*?);")
data = p.search(r.text).group(1)

data = json.loads(data)

all_data = []
for d in data:
    for v in d["values"]:
        for kk, vv in v.items():
            all_data.append([d["label"], "-", kk, vv.get("abs"), vv.get("pc")])

    for c in d["children"]:
        for v in c["values"]:
            for kk, vv in v.items():
                all_data.append(
                    [d["label"], c["label"], kk, vv.get("abs"), vv.get("pc")]
                )

df = pd.DataFrame(all_data, columns=["label 1", "label 2", "year", "abs", "pc"])
print(df.head(10).to_markdown(index=False))

Prints:

label 1 label 2 year abs pc
Totale generale delle Entrate - 2021 1.65924e 06 3463.96
Totale generale delle Entrate - 2022 0 0
Totale generale delle Entrate - 2023 0 0
Entrate correnti di natura tributaria, contributiva e perequativa - 2021 618721 1291.69
Entrate correnti di natura tributaria, contributiva e perequativa - 2022 0 0
Entrate correnti di natura tributaria, contributiva e perequativa - 2023 0 0
Entrate correnti di natura tributaria, contributiva e perequativa Imposte,tasse e proventi assimilati 2021 461223 962.887
Entrate correnti di natura tributaria, contributiva e perequativa Imposte,tasse e proventi assimilati 2022 0 0
Entrate correnti di natura tributaria, contributiva e perequativa Imposte,tasse e proventi assimilati 2023 0 0
Entrate correnti di natura tributaria, contributiva e perequativa Compartecipazioni di tributi 2021 2231.31 4.65827

CodePudding user response:

You can try the next example

import requests
import re
import json
import pandas as pd
url='https://openbilanci.it/armonizzati/bilanci/veglio-comune-bi/entrate/dettaglio?year=2021&type=preventivo'
r = requests.get(url,headers = {'User-Agent':'Mozilla/5.0'})

data = json.loads(re.search(r'var bilancio_tree = (\[{.*}\])', r.text).group(1))
#print(data)
# with open('out.json','w') as f:
#     f.write(json.dumps(data, indent=4))

lst1 = []
lst2 = []

for item in data:
    for j in item['children']:
        d={'lable':j['label']}
        lst1.append(d)
   
    for i in item['values']:
        for v in i.values():
            d2={
                'Totale generale delle Entrate Total':v['abs'],
                'Totale generale delle Entrate pc':v['pc']
            }
        
        lst2.append(d2)
        [lst1.update(lst2) for lst1, lst2 in zip(lst1, lst2)]
#print(lst1)


df = pd.DataFrame(lst1)
print(df)

Output:

                               lable                   Totale generale delle Entrate Total  Totale generale delle Entrate pc
0                 Imposte,tasse e proventi assimilati                           1659238.91                       3463.964322
1                        Compartecipazioni di tributi                                 0.00                          0.000000
2       Fondi perequativi da Amministrazioni Centrali                                 0.00                          0.000000
3   Fondi perequativi dalla Regione o Provincia au...                            618720.93                       1291.692965
4   Trasferimenti correnti da Amministrazioni pubb...                                 0.00                          0.000000
5                  Trasferimenti correnti da Famiglie                                 0.00                          0.000000
6                   Trasferimenti correnti da Imprese                            114907.44                        239.890271
7   Trasferimenti correnti da Istituzioni Sociali ...                                 0.00                          0.000000
8   Trasferimenti correnti dall'Unione europea e d...                                 0.00                          0.000000
9   Vendita di beni e servizi e proventi derivanti...                             98243.25                        205.100731
10  Proventi derivanti dall'attività di controllo ...                                 0.00                          0.000000
11                                   Interessi attivi                                 0.00                          0.000000
12               Altre entrate da redditi da capitale                            451082.56                        941.717244
13                  Rimborsi e altre entrate correnti                                 0.00                          0.000000
14                          Tributi in conto capitale                                 0.00                          0.000000
15                       Contributi agli investimenti                                 0.00                          0.000000
16              Altri trasferimenti in conto capitale                                 0.00                          0.000000
17  Entrate da alienazione di beni materiali e imm...                                 0.00                          0.000000
18                    Altre entrate in conto capitale                               522.42                          1.090647
19                Alienazione di attività finanziarie                                 0.00                          0.000000
20               Riscossione crediti di breve termine                                 0.00                          0.000000
21                       Riscossione crediti di medio                            100000.00                        208.768267
22  Altre entrate per riduzione di attività finanz...                                 0.00                          0.000000
23                 Emissione di titoli obbligazionari                                 0.00                          0.000000
24                Accensione prestiti a breve termine                            275762.31                        575.704196
25  Accensione mutui e altri finanziamenti a medio...                                 0.00                          0.000000
26                       Altre forme di indebitamento                                 0.00                          0.000000
27       Anticipazione da istituto tesoriere/cassiere                                  NaN                               NaN
28                        Entrate per partite di giro                                  NaN                               NaN
29                            Entrate per conto terzi                                  NaN                               NaN
  • Related