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 | 2204 (1408) | kunigunda |
| » | Davčne blagajne (strani: 1 2 3 4 … 24 25 26 27 )Oddelek: Programiranje | 355195 (95198) | Macketina |
| » | Bolha parser/pajek - prejemanje obvestil o novih oglasihOddelek: Programiranje | 4921 (3919) | rokko |
| » | Masterpage in jQuery(ajax call)Oddelek: Programiranje | 1495 (1323) | hatchette |
| » | java v javascript?Oddelek: Programiranje | 2211 (1914) | boss-tech |