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