Парсинг js кода в python

У меня есть код:

def get_info(link):
    html = get_html(link)
    countent = bs4.BeautifulSoup(html, 'lxml')
    page = countent.select_one('div.responsive_page_content')
    scr = page.select_one('body > div.responsive_page_frame.with_header > div.responsive_page_content > div.responsive_page_template_content > script:nth-child(8)')
    #reg = re.match('var g_rgAssets = {(.*?)};', str(scr))

    print(scr)

и получаю ответ:

<script type="text/javascript">
        var g_rgAppContextData = {"730":{"appid":730,"name":"Counter-Strike: Global Offensive","icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/730\/69f7ebe2735c366c65c0b33dae00e12dc40edbe4.jpg","link":"https:\/\/steamcommunity.com\/app\/730"}};
        var g_rgAssets = {"730":{"2":{"19991923900":{"currency":0,"appid":730,"contextid":"2","id":"19991923900","classid":"4105682661","instanceid":"480085569"...

Все эти данные не статичны,т.е обычный поиск фраз не подойдёт,я думал и пробовал регулярки,но чем не совсем получилось и получал постоянный ответ None. Ломаю голову уже минут 40 над этими треклятыми регулярками. Возможно,регулярка не подойдёт,но других способов я не знаю. Будьте добры,подскажите


Ответы (1 шт):

Автор решения: cauf

С большим трудом узнав, что все же нужно автору вопроса, могу предложить только продолжить "пробовать треклятые регулярки".

Допустим, ответ сервера состоит из тех двух строк, что вы предоставили в вопросе.

import re
from json import loads

resp = '''<script type="text/javascript">
        var g_rgAppContextData = {"730":{"appid":730,"name":"Counter-Strike: Global Offensive","icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/730\/69f7ebe2735c366c65c0b33dae00e12dc40edbe4.jpg","link":"https:\/\/steamcommunity.com\/app\/730"}};
        var g_rgAssets = {"730":{"2":{"19991923900":{"currency":0,"appid":730,"contextid":"2","id":"19991923900","classid":"4105682661","instanceid":"480085569"}}}};
</script>'''

# разделим ответ на отдельные строки
lines = resp.splitlines()
# для доступа к данным, используем именованную группу `json`
# подразумевается, что переменная g_rgAssets хранит валидный json
regexp = re.compile(r'^ +var g_rgAssets = (?P<json>.+);$')


# обходим построчно ответ
for l in lines:
    # если строка удовлетворяет паттерну регулярки
    if regexp.findall(l):
        # получаем объект результатов поиска регулярки по строке
        match = regexp.search(l)
        # получаем подстроку, совпадающую с именованной группой `json`
        raw = match.group('json')
        # сериализуем полученный json
        jsonData = loads(raw)
        print(type(jsonData), jsonData)

Здесь в регулярке для более простого доступа к данным используется именованная группа json.

В результате должны получить результат работы скрипта:

<class 'dict'> {'730': {'2': {'19991923900': {'currency': 0, 'appid': 730, 'contextid': '2', 'id': '19991923900', 'classid': '4105682661', 'instanceid': '480085569'}}}}
→ Ссылка