Парсинг 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 шт):
С большим трудом узнав, что все же нужно автору вопроса, могу предложить только продолжить "пробовать треклятые регулярки".
Допустим, ответ сервера состоит из тех двух строк, что вы предоставили в вопросе.
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'}}}}