Есть два пути.Легко и неправильно.Или не так просто, но правильно.
Я не собираюсь рекомендовать вам легкий путь.Правильный способ - использовать синтаксический анализатор Javascript.Для современного Javascript esprima - хороший выбор.Существует интерактивная онлайн-демонстрация , которая также доступна в виде * Python-модуля 1008 *.
import esprima
# script body as extracted from beautifulsoup
script_text = """
var myvar = {
productid: "101",
productname: "Abc",
};
""";
tokens = esprima.tokenize(script_text)
. В этом простом сценарии ничего особенного не происходит.Список необработанных токенов будет достаточен, чтобы получить нужные значения.Это выглядит так:
[
{
"type": "Keyword",
"value": "var"
},
{
"type": "Identifier",
"value": "myvar"
},
{
"type": "Punctuator",
"value": "="
},
{
"type": "Punctuator",
"value": "{"
},
{
"type": "Identifier",
"value": "productid"
},
{
"type": "Punctuator",
"value": ":"
},
{
"type": "String",
"value": "\"101\""
},
{
"type": "Punctuator",
"value": ","
},
{
"type": "Identifier",
"value": "productname"
},
{
"type": "Punctuator",
"value": ":"
},
{
"type": "String",
"value": "\"Abc\""
},
{
"type": "Punctuator",
"value": ","
},
{
"type": "Punctuator",
"value": "}"
},
{
"type": "Punctuator",
"value": ";"
}
]
Переберите список и выберите нужные значения.
token_iterator = iter(tokens)
for token in token_iterator:
if token["type"] == "Identifier" and token["value"] == "productname":
# the token after the next must be the one that holds the associated value
value_token = next(next(token_iterator))
productname = value_token["value"]
В более сложных ситуациях может потребоваться анализ сценария в дереве и обход дерева.
tree = esprima.parse(script_text)
Дерево более сложное (его можно просмотреть в интерактивном режиме.страница), но в обмен он несет всю контекстную информацию, которая отсутствует в списке простых токенов.Затем вы можете использовать шаблон посетителя, чтобы пройти это дерево в определенное место.В пакете Python есть пример использования шаблона посетителя , если вам интересно.