Forum » Programiranje » [Python] json.decoder.JSONDecodeError
[Python] json.decoder.JSONDecodeError

HotBurek ::
Dobro jutro.
Evo, ker se za pravega moškega spodobi double trouble, nadaljujem in odpiram novo temo.
Včeraj sem naletel na situacijo, kjer je parser začel vračat error: json.decoder.JSONDecodeError
In to brez razloga. Ker, nekaj tednov nazaj je delal, sedaj pa ne več.
Schema.org parser pravi, da je vse vredu: https://validator.schema.org/#url=https...
V zgodbo sem vključil spletnega pomočnika.
In ta mi je pokazal pot.
Izsek iz kode, ki mi jo je ponudil:
In sem začel raziskovat, kaj vse od "script" in "ld+json" je v HTML fajlu.
Ter našel, da je v samem source HTML fajlu (response, ki pride nazaj), več teh script ld+json blokov. Tako, na oko se to ne opazi hitro. V brskalniku sicer Ctrl+F ter iskalni niz "ld+json" najde oba...
Tale je bil tist, ta interesantni:
In ker je prazen, parser vrača error.
Takole je to opisal spletni pomočnik:
Skratka empty or contains... Empty. Empty.
In sedaj še končna rešitev (Ki je sicer prirejena, ker v mojem primeru se na koncu for loop-a prepiše input_html z str(soup), potem pa se input_html parsa naprej. Ampak logika, kako odkrit preveč robate script ld+json elemente, je pa ista.):
Output:
To je to.
Ter končni rezultat: https://www.akopli.com/product/00000005...
Well done.
Pa še nekaj glasbe za pomoč pri premagovanju vsakodnevnih izzivov:
Evo, ker se za pravega moškega spodobi double trouble, nadaljujem in odpiram novo temo.
Včeraj sem naletel na situacijo, kjer je parser začel vračat error: json.decoder.JSONDecodeError
In to brez razloga. Ker, nekaj tednov nazaj je delal, sedaj pa ne več.
Schema.org parser pravi, da je vse vredu: https://validator.schema.org/#url=https...
V zgodbo sem vključil spletnega pomočnika.
In ta mi je pokazal pot.
Izsek iz kode, ki mi jo je ponudil:
soup = BeautifulSoup(html, 'html.parser') for i, tag in enumerate(soup.find_all('script', type='application/ld+json')): print(f"\n--- JSON-LD Block {i} ---") print(tag.string)
In sem začel raziskovat, kaj vse od "script" in "ld+json" je v HTML fajlu.
Ter našel, da je v samem source HTML fajlu (response, ki pride nazaj), več teh script ld+json blokov. Tako, na oko se to ne opazi hitro. V brskalniku sicer Ctrl+F ter iskalni niz "ld+json" najde oba...
Tale je bil tist, ta interesantni:
<script type="application/ld+json" id="ts_rich_snippet" data-ts-ean="4242002500140" data-ts-mpn="SMZ2014" data-ts-man="Bosch"> </script>
In ker je prazen, parser vrača error.
Takole je to opisal spletni pomočnik:
There’s a <script type="application/ld+json"> block that is empty or contains invalid JSON
Skratka empty or contains... Empty. Empty.
In sedaj še končna rešitev (Ki je sicer prirejena, ker v mojem primeru se na koncu for loop-a prepiše input_html z str(soup), potem pa se input_html parsa naprej. Ampak logika, kako odkrit preveč robate script ld+json elemente, je pa ista.):
import requests; import json; import bs4; import pprint; # set url and headers url = "https://www.multitronic.fi/ru/products/3031127"; headers = { "User-Agent": "Mozilla/5.0" }; # call get and get response response = requests.get(url, headers=headers); input_html = response.text; # soup soup = bs4.BeautifulSoup(input_html, "html.parser"); # find all script with application/ld+json all_scripts = soup.find_all("script", type="application/ld+json"); # go after each script for i in range(0, len(all_scripts)): # set script script_ld_json = all_scripts[i]; # set script text script_ld_json_text = str(script_ld_json.text); # check for empty string if script_ld_json_text.strip() == "": # remove script from source script_ld_json.decompose(); else: try: # load json to check if it is valid jl_data = json.loads(script_ld_json_text); # TODO # pprint pprint.pprint(jl_data); except json.JSONDecodeError: # remove script from source script_ld_json.decompose(); except: # pass pass;
Output:
{'@context': 'https://schema.org', '@graph': [{'@type': 'WebSite', 'name': 'Multitronic', 'url': 'https://www.multitronic.fi'}, {'@type': 'Product', 'brand': {'@type': 'Brand', 'name': 'Bosch'}, 'description': 'Купить Bosch SMZ2014 - Basket for dishwasher в ' 'Финляндии, в магазине Мультитроник по выгодной ' 'цене на сайте multitronic.fi. Оформи инвойс или ' 'такс фри в нашем магазине в Лаппеенранте.', 'gtin13': '4242002500140', 'image': 'https://www.multitronic.fi/images/prod/2/F/SMZ2014-1.webp', 'mpn': 'SMZ2014', 'name': 'Bosch SMZ2014 - Basket for dishwasher', 'offers': [{'@type': 'Offer', 'availability': 'https://schema.org/LimitedAvailability', 'price': '71.90', 'priceCurrency': 'EUR', 'url': 'https://www.multitronic.fi/ru/products/3031127'}], 'sku': 3031127}, {'@type': 'BreadcrumbList', 'itemListElement': [{'@type': 'ListItem', 'item': 'https://www.multitronic.fi/', 'name': 'Главная страница', 'position': 1}, {'@type': 'ListItem', 'item': 'https://www.multitronic.fi/bytovaia-elektronika', 'name': 'Бытовая электроника', 'position': 2}, {'@type': 'ListItem', 'item': 'https://www.multitronic.fi/bytovaia-elektronika/white-goods--bytovaia-elektroni', 'name': 'White Goods (Бытовая электрони', 'position': 3}, {'@type': 'ListItem', 'item': 'https://www.multitronic.fi', 'name': 'Аксессуары', 'position': 4}]}]}
To je to.
Ter končni rezultat: https://www.akopli.com/product/00000005...
Well done.
Pa še nekaj glasbe za pomoč pri premagovanju vsakodnevnih izzivov:
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
- spremenilo: HotBurek ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | CSV fileOddelek: Programiranje | 2081 (1285) | kunigunda |
» | Davčne blagajne (strani: 1 2 3 4 … 24 25 26 27 )Oddelek: Programiranje | 346058 (86061) | Macketina |
» | Bolha parser/pajek - prejemanje obvestil o novih oglasihOddelek: Programiranje | 4686 (3684) | rokko |
» | Masterpage in jQuery(ajax call)Oddelek: Programiranje | 1440 (1268) | hatchette |
» | java v javascript?Oddelek: Programiranje | 2153 (1856) | boss-tech |