У меня есть строка с js-кодом
[{label: ' ', name: 'Confirmed', width: 30, formatter: 'checkbox'},{label: 'ID', name: 'ID', width: 100, key:true},{label: 'E-mail', name: 'F250275', width: null, formatter: clearText},{label: 'Agree', name: 'F250386', width: null, formatter: clearText},]
Есть ли способ проанализировать его на Python, чтобы получить список? Я попробовал json.loads, но получил ошибку json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 18 (char 27)
Некоторые обновления на основе комментариев.
Здесь нет возможности использовать JS. Вот почему я не поместил здесь тег JS
@scrappedcola — я уже получаю эту строку в Python и не могу выполнять какие-либо операции js
«Я пробовал json.loads, но получаю ошибки» — Что конкретно вы пробовали и в чем конкретно заключалась ошибка? Пожалуйста, включите в вопрос минимально воспроизводимый пример. (Хотя, по крайней мере, стоит отметить, что ваш JSON недействителен.)
Это недействительный json или python. Анализ будет более сложным. Вернитесь к источнику и исправьте это, если сможете.
@Дэвид - готово, спасибо
@Headmaster: В сообщении об ошибке говорится, что у вас нет действительного JSON. Если можете, исправьте данные, чтобы они были действительными в формате JSON. В противном случае у вас есть пользовательская структура данных, которая напоминает JSON, но не является таковой. Для этого вы можете написать свою собственную логику синтаксического анализа. Или, подумав нестандартно, вы можете написать утилиту JavaScript, которая преобразует это в виде кода в переменную, сериализует ее в JSON и использует эту утилиту из вашего кода Python.
Особенность методов JSON в Python заключается в том, что они ожидают, что ваша строка будет допустимым JSON... Тот факт, что J и S в JSON обозначают Javascript, не означает, что все объекты Javascript являются действительными JSON.
@Headmaster: Если даже вызов приложения JavaScript из командной строки невозможен, хотя я никогда этого не пробовал, возможно, по крайней мере, стоит изучить это... Возможно, вы сможете создать HTML-страницу в памяти (создать шаблон своего рода, где ваш код просто подключает это строковое значение там, где это необходимо), который принимает эту структуру данных в коде JavaScript, сериализует ее в JSON и выводит этот JSON на страницу. Затем посмотрите, сможете ли вы загрузить эту страницу в память Selenium, чтобы она выполнила код, и использовать Selenium для наблюдения за результатом на этой «странице».
Чтобы использовать eval
в js, вам нужно будет обработать последний элемент: formatter: clearText
. Что такое clearText
? Как это преобразуется?
@001 — нет возможности использовать js
@Headmaster: Если существует какое-то искусственное требование, согласно которому абсолютно никакой код JavaScript не может использоваться в какой-либо форме (за исключением, очевидно, неполного кода JavaScript, используемого в самой строке), то у вас есть просто собственный формат данных. Вам нужно будет написать собственную логику для анализа этого формата данных. Возможно, вы определяете некоторую логику токенизации, возможно, вы используете регулярные выражения для получения конкретных значений, которые вам нужны, и т. д. Но вопрос «как проанализировать это в Python» становится слишком широким, если предварительно не попытаться проанализировать ваш собственный формат данных.
@001 - ответ уже найден, смело читайте и повышайте свои навыки
@David - уже нашел ответ без ручного анализа, не стесняйтесь читать и повышать свои навыки
Вот пакет для таких вещей https://pypi.org/project/calmjs.parse/
Некоторые примеры
from calmjs.parse.unparsers.extractor import ast_to_dict
from calmjs.parse import es5
my_string_with_js = "here is js code from the question"
configuration = es5(my_string_with_js)
baseconf = ast_to_dict(configuration)
Если это тот же общий формат, вы можете попытаться преобразовать его в действительный JSON, заключив имена свойств в кавычки и преобразуя одинарные кавычки в двойные.
Вот демо-код:
import re
import json
def js2json(str):
l = [];
objs = re.findall(r"({[^}]*})", str); # get objects
for obj in objs:
obj = re.sub(r"([{,]\s*)([a-zA-Z0-9_]+)", r'\1"\2"', obj); # quote object property names
obj = re.sub(r"(:\s*)'?([^',\}]+)'?", r'\1"\2"', obj); # quote object property values
l.append(json.loads(obj))
return l
str = "[{label: ' ', name: 'Confirmed', width: 30, formatter: 'checkbox'},{label: 'ID', name: 'ID', width: 100, key:true},{label: 'E-mail', name: 'F250275', width: null, formatter: clearText},{label: 'Agree', name: 'F250386', width: null, formatter: clearText},]"
print(js2json(str))
Итак, вам необходимо проверить свой json (jsonlint.com). Вероятно, вам придется использовать
JSON.stringify(YOUR_OBJ)
. Чтобы получить ваш объект JS как действительный json, прежде чем вы сможете использовать его в pyton.