Python не читает допустимый JSON - PullRequest
1 голос
/ 08 марта 2019

Я извлекаю некоторый исходный код HTML с веб-страницы для извлечения данных, хранящихся в формате 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
s = str(s)
s = s[119:-16]

json_data = json.loads(s)

Запуск вышеуказанного кода приводит к этой ошибке:

json.decoder.JSONDecodError: Expecting ',' delimiter: line 1 column 7506 (char7505)

Когда я беру содержимое переменной s и передаю его в форматер json, оно распознается как правильный json.

Я использовал следующий веб-сайт для проверки json: http://jsonprettyprint.com/json-pretty-printer.php

Почему эта ошибка возникает при использовании json.loads () в Python?Я предполагаю, что это как-то связано с неправильной кодировкой строки или наличием escape-символов?

Как мне решить эту проблему?

Ответы [ 4 ]

1 голос
/ 08 марта 2019
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 7484 (char 7483)

Используя сообщение об ошибке, вы можете напечатать фрагмент строки, чтобы увидеть, где он выходит из строя.

print(s[7400:7500])
mailboxes.isPrimary=\\"true\\" AND ymreq

Как указано в skaul05, он выходит из строя из-за токена true встрока.

1 голос
/ 08 марта 2019

Ваш JSON содержит некоторые неожиданные токены, такие как true. Для разрешения используйте сначала json.dumps.

print (json.dumps(s,indent =2))
s = json.dumps(s)
json_data = json.loads(s)
0 голосов
/ 08 марта 2019

Если бы это был действительный текст в формате JSON, то парсер не жаловался бы.Вот как я это проверил

//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

Возможно, вам сначала нужно проанализировать его, чтобы сначала проверить действительный xml.

0 голосов
/ 08 марта 2019
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)

есть что-то сильное, когда вы имеете дело со списком, вы просто используете str()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...