Задать вопрос
Malodar
@Malodar
Начинающий питонист

Как извлечь JSON объект из содержимого тэга script?

Чувствую, что брожу рядом с решением, но никак не найду. Помогите, пожалуйста: при парсинге сайта заметил, что необходимая мне информация содержится в тэге script такого содержания (сократил, чтобы вписаться в лимит по символам. Полный вариант содержимого тэга можно найти тут):
<script>
            var __RELAY_BOOTSTRAP__ = "[[\"{\\\"queryID\\\":\\\"routes_ArtistTopLevelQuery\\\",\\\"variables\\\":{\\\"artistID\\\":\\\"ira-svobodova\\\"}}\",{\"ok\":true,\"status\":200,\"url\":\"https:\\u002F\\u002Fmetaphysics-production.artsy.net\",\"headers\":{\"_headers\":{\"access-control-allow-origin\":[\"*\"],\"content-encoding\":[\"gzip\"],\"content-type\":[\"application\\u002Fjson; charset=utf-8\"],\"date\":[\"Fri, 15 Mar 2019 10:32:42 GMT\"],\"etag\":[\"W\\u002F\\\"785-\\u002FZgwv+hndU9pyFynaJJ6RkTpj+o\\\"\"],\"vary\":[\"Accept-Encoding\"],\"x-powered-by\":[\"Express\"],\"transfer-encoding\":[\"chunked\"],\"connection\":[\"Close\"]}},\"json\":{\"data\":{\"artist\":{\"_id\":\"53d03be572616939ddf80000\",\"id\":\"ira-svobodova\",\"name\":\"Ira Svobodová\",\"nationality\":\"Czech\",\"years\":\"born 1986\",\"counts\":{\"follows\":192},\"carousel\":{\"images\":[{\"href\":\"\\u002Fartwork\\u002Fira-svobodova-nights-in-secret-garden-1\",\"resized\":{\"url\":\"https:\\u002F

....

mage_title\":\"Ira Svobodová, ‘Framing Space 6’, 2018\",\"is_biddable\":false,\"sale\":null,\"is_acquireable\":false,\"is_offerable\":false,\"href\":\"\\u002Fartwork\\u002Fira-svobodova-framing-space-6\",\"date\":\"2018\",\"sale_message\":\"Contact For Price\",\"cultural_maker\":null,\"artists\":[{\"__id\":\"QXJ0aXN0OmlyYS1zdm9ib2RvdmE=\",\"href\":\"\\u002Fartist\\u002Fira-svobodova\",\"name\":\"Ira Svobodová\"}],\"collecting_institution\":null,\"partner\":{\"name\":\"Christine König Galerie\",\"href\":\"\\u002Fchristine-konig-galerie\",\"__id\":\"UGFydG5lcjpjaHJpc3RpbmUta29uaWctZ2FsZXJpZQ==\",\"type\":\"Gallery\"},\"sale_artwork\":null,\"is_inquireable\":true,\"id\":\"ira-svobodova-framing-space-6\",\"is_saved\":false}},{\"node\":{\"__id\":\"QXJ0d29yazppcmEtc3ZvYm9kb3ZhLWZyYW1pbmctc3BhY2UtNQ==\",\"image\":{\"aspect_ratio\":0.79,\"placeholder\":\"126.8528464017186%\",\"url\":\"https:\\u002F\\u002Fd32dm0rphc51dk.cloudfront.net\\u002FPx6-PRTdfIiSv2kD1ZCIUQ\\u002Flarge.jpg\"},\"_id\":\"5c4849ff2ebe314b4cb841ac\",\"title\":\"Framing Space 5\",\"image_title\":\"Ira Svobodová, ‘Framing Space 5’, 2018\",\"is_biddable\":false,\"sale\":null,\"is_acquireable\":false,\"is_offerable\":false,\"href\":\"\\u002Fartwork\\u002Fira-svobodova-framing-space-5\",\"date\":\"2018\",\"sale_message\":\"Contact For Price\",\"cultural_maker\":null,\"artists\":[{\"__id\":\"QXJ0aXN0OmlyYS1zdm9ib2RvdmE=\",\"href\":\"\\u002Fartist\\u002Fira-svobodova\",\"name\":\"Ira Svobodová\"}],\"collecting_institution\":null,\"partner\":{\"name\":\"Christine König Galerie\",\"href\":\"\\u002Fchristine-konig-galerie\",\"__id\":\"UGFydG5lcjpjaHJpc3RpbmUta29uaWctZ2FsZXJpZQ==\",\"type\":\"Gallery\"},\"sale_artwork\":null,\"is_inquireable\":true,\"id\":\"ira-svobodova-framing-space-5\",\"is_saved\":false}}]}},\"href\":\"\\u002Fartist\\u002Fira-svobodova\",\"is_consignable\":false}}}]]";
          </script>


Я хочу извлечь из него заключенный в нем JSON объект (в [[ ]]), для чего удалял " var __RELAY_BOOTSTRAP__ = " и ";" , пытался убирать экранирование симолов через scr.replace('\\', ''), и пытался грузить получившуюся строку через json.loads(scr). Но постоянно натыкаюсь на ошибки типа json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 84 (char 83). Т.е., если я правильно понял, проблема в правильной "нормалзации" строки для дальнейшего преобразования в JSON объект. И похоже с этим у меня проблемы.
Может есть какой-то общий подход к решению этой задачи?
  • Вопрос задан
  • 203 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
dollar
@dollar
Делай добро и бросай его в воду.
\\\"
Это вообще похоже на двойное кодирование.

Раскодируйте сначала вручную. Да хотя бы в консоли браузера. Плюс такого подхода в том, что вы видите, что у вас на каждом этапе. Вот у меня получилось ещё два JSON'a (а если приглядеться, то всё сложнее):
5c8dd0b7cc88c092764002.png
Далее каждый нужно снова декодировать. Удачи.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Malodar
@Malodar Автор вопроса
Начинающий питонист
а, вроде разобрался :)
использовал json.loads(json.loads(text))
Спасибо за подсказку с двойным кодированием!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы