Script — баланс скобок (парсинг)

При скрапинге (парсинге) столкнулся с проблемой «баланса скобок» некоторые сайты генерируют неправильный script в результате чего не получается преобразовать script в питоний словарь.

Временное решение: проверить нужный найденный script на баланс скобок.

def is_balanced(text, brackets="[]{}"):
    L = list(map(re.escape, brackets))  # make it safe for a regex
    regex = re.compile('|'.join(  # O <-> opening, C <-> closing
        ['{O}[^{B}]*{C}'.format(B=''.join(L),**vars()) for O, C in zip(L[::2], L[1::2])]))
    n = "number of substitutions"
    while n:
        text, n = regex.subn('', text)  # remove non-nested/flat balanced parts
    return set(brackets).isdisjoint(text)  # no [unbalanced] brackets left

Функция is_balanced: если все скобки правильно закрыты выдаст True если нет то False. По моей практике баланс скобок нарушается в конце скрипта исходя из этого, пишем скрипт который начинает потихоньку резать по символу начиная снизу и делать проверку пока не достигнет значения True.

i = 0
while is_balanced(script) == False:
    i = i - 1
    script = script[:i]

Далее можно спокойно преобразовать в питоний словарь:

script_dict = json.loads(script)

и спокойно доставать необходимые значения.

print(script_dict['@id'])


бывает такое что функция выдает True но в питоний словарь преобразовать не может из-за наличия междустрочных пробелов, чтобы убрать эти пробелы можно воспользоваться replace перед json.loads(script)

script = script.replace('\n', ' ')

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *