Попытка преобразовать JSON в словарь в python - PullRequest
0 голосов
/ 24 апреля 2020

Я очистил веб-сайт для приложения / ld + json, и он возвращает json, и я хочу преобразовать строку в словарь python, и он, похоже, не работает. В терминале я получаю ошибку JSONDecodeError («Ожидаемое значение», s, err.value) от None. Я относительно новичок в работе с JSON, поэтому мог допустить глупую ошибку, но все, что я обнаружил при переполнении стека, не сработало. Буду признателен за любую помощь, и спасибо, что нашли время, чтобы прочитать мой пост!

Вот мой код

from flask import Flask, render_template
from bs4 import BeautifulSoup
import requests
import json

source = requests.get('https://www.visionlearning.com/en/library/Chemistry/1/Nuclear-Chemistry/59').text
soup = BeautifulSoup(source, 'html.parser')

jsonString = str(soup.find_all('script', type='application/ld+json')[0])
print(json.loads(jsonString))

Ответы [ 4 ]

2 голосов
/ 24 апреля 2020

Если вы распечатаете jsonString, вы увидите, что он содержит вкладку <script>, просто получите внутреннее содержимое:

jsonString = str(soup.find_all('script', type='application/ld+json')[0].text)
1 голос
/ 24 апреля 2020

Так как вы получаете первое значение. Вам не нужно использовать .find_all. .find вернет первое значение. Поверните его в строку с помощью .get_text или .text, затем приведите к json.

from bs4 import BeautifulSoup
import requests
import json

source = requests.get('https://www.visionlearning.com/en/library/Chemistry/1/Nuclear-Chemistry/59').text
soup = BeautifulSoup(source, 'html.parser')

jsonString = soup.find('script', type='application/ld+json')

print(json.loads(jsonString.get_text(strip=True)))
1 голос
/ 24 апреля 2020
import requests
from bs4 import BeautifulSoup
import json


def main(url):
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html.parser')
    target = json.loads(soup.find("script").text)
    print(target.keys())


main("https://www.visionlearning.com/en/library/Chemistry/1/Nuclear-Chemistry/59")

Выход:

dict_keys(['@context', '@type', 'mainEntityOfPage', 'name', 'headline', 'author', 'datePublished', 'dateModified', 'image', 'publisher', 'description', 'keywords', 'inLanguage', 'copyrightHolder', 'copyrightYear'])
0 голосов
/ 25 апреля 2020

Это то, что в итоге сработало. Я добавил .contents [0] в конец jsonString

source = requests.get('https://www.visionlearning.com/en/library/Chemistry/1/Nuclear-Chemistry/59')
soup = BeautifulSoup(source.content, 'html.parser')

jsonString = soup.find_all('script', type='application/ld+json')[0].contents[0]
print(json.loads(jsonString))

Спасибо за помощь, хотя!

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