Tell me how to convert a Script object into a Python dictionary.

file = open('D:/html/trabl/00c5b03b5fc55b70978200771a28c62f.html', 'r', encoding='utf-8').read() soup = BeautifulSoup(file, 'lxml') category = soup.find("script") 

output category at this stage:

 <script type="application/ld+json"> { "@context" : "http://schema.org", "@id" : "https://rutube.ru/video/00c5b03b5fc55b70978200771a28c62f/", "name": "Замуж за Бузову: Лебедев, Зеленский, Наумов и Коробков борются за первое свидание (выпуск 2) на Rutube", "description": "Первая четверка парней борется за первое свидание с Ольгой Бузовой. Ребятам предстоит на мини гондоле приплыть на другую сторону берега к Ольге Бузовой и вот кто сделает это первым - выйдет в финал данного испытания и будет бороться за первый тет-а-тет с телеведущей Бузовой.. Фрагмент из 1 сезон 2 выпуск программы Замуж за Бузову ", "@type" : "TVClip", "partOfSeries" : { "@type" : "TVSeries", "name" : "Замуж за Бузову", "url": "https://rutube.ru/metainfo/tv/7656/" }, "partOfSeason" : { "@type" : "TVSeason", "seasonNumber" : "1" }, "partOfEpisode" : { "@type" : "TVEpisode", "episodeNumber" : "2" }, "image" : "https://pic.rutube.ru/video/00/d2/00d2e173aeb89893be7012a31f9b22ed.png", "director": [], "actor": [ { "sameAs": "https://rutube.ru/metainfo/person/33143/", "@type": "Person", "name": "\u041e\u043b\u044c\u0433\u0430 \u0411\u0443\u0437\u043e\u0432\u0430" }, { "sameAs": "https://rutube.ru/metainfo/person/135794/", "@type": "Person", "name": "\u0410\u043d\u0434\u0440\u0435\u0439 \u041d\u0430\u0443\u043c\u043e\u0432" }, { "sameAs": "https://rutube.ru/metainfo/person/149597/", "@type": "Person", "name": "\u0414\u0435\u043d\u0438\u0441 \u041b\u0435\u0431\u0435\u0434\u0435\u0432" }, { "sameAs": "https://rutube.ru/metainfo/person/149598/", "@type": "Person", "name": "\u0421\u0435\u0440\u0433\u0435\u0439 \u0417\u0435\u043b\u0435\u043d\u0441\u043a\u0438\u0439" }, { "sameAs": "https://rutube.ru/metainfo/person/149604/", "@type": "Person", "name": "\u0412\u0430\u043b\u0435\u043d\u0442\u0438\u043d \u041a\u043e\u0440\u043e\u0431\u043a\u043e\u0432" } ], "video": { "@type": "VideoObject", "description": "Первая четверка парней борется за первое свидание с Ольгой Бузовой. Ребятам предстоит на мини гондоле приплыть на другую сторону берега к Ольге Бузовой и вот кто сделает это первым - выйдет в финал данного испытания и будет бороться за первый тет-а-тет с телеведущей Бузовой.", "duration": "PT1M49S", "url": "https://rutube.ru/video/00c5b03b5fc55b70978200771a28c62f/", "name": "Замуж за Бузову: Лебедев, Зеленский, Наумов и Коробков борются за первое свидание (выпуск 2)", "thumbnail": "00c5b03b5fc55b70978200771a28c62f", "thumbnailUrl": "https://pic.rutube.ru/video/00/d2/00d2e173aeb89893be7012a31f9b22ed.png", "uploadDate" : "2018-09-09T20:08:34", "embedUrl": "https://rutube.ru/play/embed/11369801", "interactionStatistic": [ {"@type": "InteractionCounter", "interactionType": "http://schema.org/WatchAction", "userInteractionCount": "1399" } ] }, "datePublished": "2018-09-09T21:57:48", "isFamilyFriendly": "true", "genre": "Телепередачи", "potentialAction": { "@type": "WatchAction", "target": [ { "url": "https://rutube.ru/video/00c5b03b5fc55b70978200771a28c62f/", "inLanguage": "ru", "actionPlatform": [ "http://schema.org/DesktopWebPlatform", "http://schema.org/MobileWebPlatform", "http://schema.org/IOSPlatform" ]}, { "url": "android-app://ru.rutube.app/http/rutube.ru/video/00c5b03b5fc55b70978200771a28c62f/", "inLanguage": "ru", "actionPlatform": "http://schema.org/AndroidPlatform" } ] }} } </script> 

I can't get "genre": "TV shows",

  • print(d['genre']) ? - m0nte-cr1st0

1 answer 1

You need to get the contents of the <script> and convert it to a dictionary using json.loads()

HTML string:

 html = """ <script type="application/ld+json"> { "@context" : "http://schema.org", "@id" : "https://rutube.ru/video/00c5b03b5fc55b70978200771a28c62f/", "name": "Замуж за Бузову: Лебедев, Зеленский, Наумов и Коробков борются за первое свидание (выпуск 2) на Rutube", "description": "Первая четверка парней борется за первое свидание с Ольгой Бузовой. Ребятам предстоит на мини гондоле приплыть на другую сторону берега к Ольге Бузовой и вот кто сделает это первым - выйдет в финал данного испытания и будет бороться за первый тет-а-тет с телеведущей Бузовой.. Фрагмент из 1 сезон 2 выпуск программы Замуж за Бузову ", "@type" : "TVClip", "partOfSeries" : { "@type" : "TVSeries", "name" : "Замуж за Бузову", "url": "https://rutube.ru/metainfo/tv/7656/" }, "partOfSeason" : { "@type" : "TVSeason", "seasonNumber" : "1" }, "partOfEpisode" : { "@type" : "TVEpisode", "episodeNumber" : "2" }, "image" : "https://pic.rutube.ru/video/00/d2/00d2e173aeb89893be7012a31f9b22ed.png", "director": [], "actor": [ { "sameAs": "https://rutube.ru/metainfo/person/33143/", "@type": "Person", "name": "\u041e\u043b\u044c\u0433\u0430 \u0411\u0443\u0437\u043e\u0432\u0430" }, { "sameAs": "https://rutube.ru/metainfo/person/135794/", "@type": "Person", "name": "\u0410\u043d\u0434\u0440\u0435\u0439 \u041d\u0430\u0443\u043c\u043e\u0432" }, { "sameAs": "https://rutube.ru/metainfo/person/149597/", "@type": "Person", "name": "\u0414\u0435\u043d\u0438\u0441 \u041b\u0435\u0431\u0435\u0434\u0435\u0432" }, { "sameAs": "https://rutube.ru/metainfo/person/149598/", "@type": "Person", "name": "\u0421\u0435\u0440\u0433\u0435\u0439 \u0417\u0435\u043b\u0435\u043d\u0441\u043a\u0438\u0439" }, { "sameAs": "https://rutube.ru/metainfo/person/149604/", "@type": "Person", "name": "\u0412\u0430\u043b\u0435\u043d\u0442\u0438\u043d \u041a\u043e\u0440\u043e\u0431\u043a\u043e\u0432" } ], "video": { "@type": "VideoObject", "description": "Первая четверка парней борется за первое свидание с Ольгой Бузовой. Ребятам предстоит на мини гондоле приплыть на другую сторону берега к Ольге Бузовой и вот кто сделает это первым - выйдет в финал данного испытания и будет бороться за первый тет-а-тет с телеведущей Бузовой.", "duration": "PT1M49S", "url": "https://rutube.ru/video/00c5b03b5fc55b70978200771a28c62f/", "name": "Замуж за Бузову: Лебедев, Зеленский, Наумов и Коробков борются за первое свидание (выпуск 2)", "thumbnail": "00c5b03b5fc55b70978200771a28c62f", "thumbnailUrl": "https://pic.rutube.ru/video/00/d2/00d2e173aeb89893be7012a31f9b22ed.png", "uploadDate" : "2018-09-09T20:08:34", "embedUrl": "https://rutube.ru/play/embed/11369801", "interactionStatistic": [ {"@type": "InteractionCounter", "interactionType": "http://schema.org/WatchAction", "userInteractionCount": "1399" } ] }, "datePublished": "2018-09-09T21:57:48", "isFamilyFriendly": "true", "genre": "Телепередачи", "potentialAction": { "@type": "WatchAction", "target": [ { "url": "https://rutube.ru/video/00c5b03b5fc55b70978200771a28c62f/", "inLanguage": "ru", "actionPlatform": [ "http://schema.org/DesktopWebPlatform", "http://schema.org/MobileWebPlatform", "http://schema.org/IOSPlatform" ]}, { "url": "android-app://ru.rutube.app/http/rutube.ru/video/00c5b03b5fc55b70978200771a28c62f/", "inLanguage": "ru", "actionPlatform": "http://schema.org/AndroidPlatform" } ] }} } </script> """ 

Next parsim. It looks like in your example there is an extra curly bracket at the end, so you need to trim it from the result, otherwise the JSON parser gives an error.

 import json from bs4 import BeautifulSoup category = BeautifulSoup(html, 'lxml') category_text = category.text[:-3] category_dict = json.loads(category_text) print(category_dict['@id']) # https://rutube.ru/video/00c5b03b5fc55b70978200771a28c62f/