Je récupère une source HTML d'une page Web pour extraire des données stockées au format json
Voici le code:
json.decoder.JSONDecodError: Expecting ',' delimiter: line 1 column 7506 (char7505)
L'exécution de ce qui précède génère cette erreur :
url = 'https://finance.yahoo.com/quote/SPY' result = requests.get(url) c = result.content html = BeautifulSoup(c, 'html.parser') scripts = html.find_all('script') sl =[] for s in scripts: sl.append(s) s = (sl[-3]) s = s.contents s = str(s) s = s[119:-16] json_data = json.loads(s)
Quand je prends le contenu de la variable s et le passe à un formateur json, il est reconnu comme json approprié.
J'ai utilisé le site Web suivant pour vérifier le json: http://jsonprettyprint.com/json-pretty-printer.php p >
Pourquoi cette erreur survient lors de l'utilisation de json.loads () en Python? Je suppose que cela a quelque chose à voir avec la chaîne qui n'est pas encodée correctement ou la présence de caractères d'échappement?
Comment résoudre ce problème?
4 Réponses :
Votre JSON contient certains jetons inattendus tels que true
. Utilisez d'abord json.dumps
pour le résoudre.
print (json.dumps(s,indent =2)) s = json.dumps(s) json_data = json.loads(s)
import requests from bs4 import BeautifulSoup import json url = 'https://finance.yahoo.com/quote/SPY' result = requests.get(url) c = result.content html = BeautifulSoup(c, 'html.parser') scripts = html.find_all('script') sl =[] for s in scripts: sl.append(s) s = (sl[-3]) s = s.contents a = s[0][111:-12] jjjj = json.loads(a) there's somethingrong when you deal with the list,you just use str()
Pourquoi? c'est juste où vous vous trompez? pourquoi me donner une telle évaluation?
pouvez-vous résoudre ce problème par la méthode fournie par le second? hehe
S'il s'agissait d'un texte au format JSON valide, l'analyseur ne se plaindrait pas. Voici comment je l'ai testé
//first I scraped that page curl https://finance.yahoo.com/quote/SPY > SPY.json //then tried to parse it using json a = open("SPY.json") b = json.load(a) ValueError: No JSON object could be decoded
Vous devez probablement d'abord l'analyser en un xml valide.
print(s[7400:7500]) mailboxes.isPrimary=\\"true\\" AND ymreq
pourriez-vous imprimer votre JSON avant json.loads. Vous devez manquer une sorte de délimiteur là-dedans
L'objet json est trop gros pour que je puisse le publier ici sous forme de texte