Как конвертировать JavaScript фрагмент, извлеченный из YouTube, для соответствия JSON - PullRequest
0 голосов
/ 26 апреля 2020

Есть ли способ обработать следующую строку, чтобы она соответствовала стандарту JSON? (ключи и значения должны быть в двойных кавычках)

{ 'VIDEO_ID': "3xOYjRcgibA", 'LIST_ID': "PLfKGJrRXSczdRU1RCcEOJ9TDtvWUA1VU2", 'WAIT_TO_DELAYLOAD_FRAME_CSS': true, 'IS_UNAVAILABLE_PAGE': false, 'DROPDOWN_ARROW_URL': "\/yts\/img\/pixel-vfl3z5WfW.gif", 'AUTONAV_EXTRA_CHECK': false, 'JS_PAGE_MODULES': [ 'www/watch', 'www/ypc_bootstrap', 'www/watch_speedyg', 'www/watch_autoplayrenderer', '' ], "text": [ 'It shouldn\'t replace here', 'And don't here' ], 'test': 5 }

Фрагмент был извлечен из YouTube веб-страницы JavaScript code.

Следующий код python является попыткой извлечь строку из веб-страницы и преобразовать ее в структуру данных

import codecs
import requests
import json
import re

url  = 'https://www.youtube.com/watch?v=3xOYjRcgibA&list=PLfKGJrRXSczdRU1RCcEOJ9TDtvWUA1VU2'

page = requests.get(url)
html = page.content
html = html.decode('utf-8')
html = html.replace('\n','')
html = re.sub(' +',' ',html)

p = re.compile('yt.setConfig\((.*?)\);')
str = p.findall(html)
s = str[0]
data = json.loads(s)

Вывод

C:\temp\work\python>temp.py
Traceback (most recent call last):
  File "C:\temp\work\python\temp.py", line 17, in <module>
    data = json.loads(s)
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\lib\json\decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 3 (char 2)

В perl желаемый результат может быть достигнут с помощью следующего кода

use strict;
use warnings;
use feature 'say';

my $data = <DATA>;

$data =~ s/'(.*?)'([:, \]])/"$1"$2/gs;

say $data;

__DATA__
{ 'VIDEO_ID': "3xOYjRcgibA", 'LIST_ID': "PLfKGJrRXSczdRU1RCcEOJ9TDtvWUA1VU2", 'WAIT_TO_DELAYLOAD_FRAME_CSS': true, 'IS_UNAVAILABLE_PAGE': false, 'DROPDOWN_ARROW_URL': "\/yts\/img\/pixel-vfl3z5WfW.gif", 'AUTONAV_EXTRA_CHECK': false, 'JS_PAGE_MODULES': [ 'www/watch', 'www/ypc_bootstrap', 'www/watch_speedyg', 'www/watch_autoplayrenderer', '' ], "text": [ 'It shouldn\'t replace here', 'And don't here' ], 'test': 5 }

Выход

{ "VIDEO_ID": "3xOYjRcgibA", "LIST_ID": "PLfKGJrRXSczdRU1RCcEOJ9TDtvWUA1VU2", "WAIT_TO_DELAYLOAD_FRAME_CSS": true, "IS_UNAVAILABLE_PAGE": false, "DROPDOWN_ARROW_URL": "\/yts\/img\/pixel-vfl3z5WfW.gif", "AUTONAV_EXTRA_CHECK": false, "JS_PAGE_MODULES": [ "www/watch", "www/ypc_bootstrap", "www/watch_speedyg", "www/watch_autoplayrenderer", "" ], "text": [ "It shouldn\'t replace here", "And don't here" ], "test": 5 }

1 Ответ

1 голос
/ 26 апреля 2020

Попробуйте,

import codecs
import requests
import json
import re

url  = 'https://www.youtube.com/watch?v=3xOYjRcgibA&list=PLfKGJrRXSczdRU1RCcEOJ9TDtvWUA1VU2'

page = requests.get(url)
html = page.content
html = html.decode('utf-8')
html = html.replace('\n','')
html = re.sub(' +',' ',html)

p = re.compile('yt.setConfig\((.*?)\);')
str = p.findall(html)
s = str[0]
with open('data.txt', 'w') as outfile:
    json.dump(s, outfile)
with open('data.txt') as json_file:
    data = json.load(json_file)
print(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...