Разобрать строку js в python

У меня есть строка с 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

Итак, вам необходимо проверить свой json (jsonlint.com). Вероятно, вам придется использовать JSON.stringify(YOUR_OBJ). Чтобы получить ваш объект JS как действительный json, прежде чем вы сможете использовать его в pyton.

scrappedcola 17.07.2024 22:22

@scrappedcola — я уже получаю эту строку в Python и не могу выполнять какие-либо операции js

Headmaster 17.07.2024 22:27

«Я пробовал json.loads, но получаю ошибки» — Что конкретно вы пробовали и в чем конкретно заключалась ошибка? Пожалуйста, включите в вопрос минимально воспроизводимый пример. (Хотя, по крайней мере, стоит отметить, что ваш JSON недействителен.)

David 17.07.2024 22:27

Это недействительный json или python. Анализ будет более сложным. Вернитесь к источнику и исправьте это, если сможете.

001 17.07.2024 22:28

@Дэвид - готово, спасибо

Headmaster 17.07.2024 22:28

@Headmaster: В сообщении об ошибке говорится, что у вас нет действительного JSON. Если можете, исправьте данные, чтобы они были действительными в формате JSON. В противном случае у вас есть пользовательская структура данных, которая напоминает JSON, но не является таковой. Для этого вы можете написать свою собственную логику синтаксического анализа. Или, подумав нестандартно, вы можете написать утилиту JavaScript, которая преобразует это в виде кода в переменную, сериализует ее в JSON и использует эту утилиту из вашего кода Python.

David 17.07.2024 22:30

Особенность методов JSON в Python заключается в том, что они ожидают, что ваша строка будет допустимым JSON... Тот факт, что J и S в JSON обозначают Javascript, не означает, что все объекты Javascript являются действительными JSON.

I wrestled a bear once. 17.07.2024 22:36

@Headmaster: Если даже вызов приложения JavaScript из командной строки невозможен, хотя я никогда этого не пробовал, возможно, по крайней мере, стоит изучить это... Возможно, вы сможете создать HTML-страницу в памяти (создать шаблон своего рода, где ваш код просто подключает это строковое значение там, где это необходимо), который принимает эту структуру данных в коде JavaScript, сериализует ее в JSON и выводит этот JSON на страницу. Затем посмотрите, сможете ли вы загрузить эту страницу в память Selenium, чтобы она выполнила код, и использовать Selenium для наблюдения за результатом на этой «странице».

David 17.07.2024 22:37

Чтобы использовать eval в js, вам нужно будет обработать последний элемент: formatter: clearText. Что такое clearText? Как это преобразуется?

001 17.07.2024 22:41

@001 — нет возможности использовать js

Headmaster 17.07.2024 22:44

@Headmaster: Если существует какое-то искусственное требование, согласно которому абсолютно никакой код JavaScript не может использоваться в какой-либо форме (за исключением, очевидно, неполного кода JavaScript, используемого в самой строке), то у вас есть просто собственный формат данных. Вам нужно будет написать собственную логику для анализа этого формата данных. Возможно, вы определяете некоторую логику токенизации, возможно, вы используете регулярные выражения для получения конкретных значений, которые вам нужны, и т. д. Но вопрос «как проанализировать это в Python» становится слишком широким, если предварительно не попытаться проанализировать ваш собственный формат данных.

David 17.07.2024 22:48

@001 - ответ уже найден, смело читайте и повышайте свои навыки

Headmaster 18.07.2024 06:34

@David - уже нашел ответ без ручного анализа, не стесняйтесь читать и повышать свои навыки

Headmaster 18.07.2024 06:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
13
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот пакет для таких вещей 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))

Другие вопросы по теме