Нужно отрендерить JS в локальном HTML-файле для дальнейшего парсинга, который перед этим еще проходит отчистку, поэтому рендерить нужно даже не файл, а строку.
Я помню рендерил через requests_html, но как ему скормить строку не пойму.
К тому же у меня почему-то возникает ошибка ImportError: circular import, потому что requests_html что-то там намудрил.
В общем прошу любой помощи.
Мне некоторое время назад понадобилось достать данные из сайта, написанного на nuxt.js. Помогло использовать js2py. У меня вообще замороченная история была, сайт погиб из-за конфликта владельцев, поэтому я упражнялся с вебархивом и кэшом гугла...
# основная функция, которая парсит файлы
# если имя начинается на websites, то это вебархив, из пути берётся archive_timestamp и code
# если имя начинается на webc, то это кэш гуглопоиска, и параметры берутся из шапки страницы
def parse_release(fn):
with open(fn, "r") as f:
pg = f.read()
assert pg != ""
tree = htmlparse(pg)
if fn.startswith("websites/"):
archive_source = "webarchive"
archive_timestamp = int(fn.split("/")[2])
code = fn.split("/")[4]
else:
archive_source = "googlewebcache"
archive_timestamp = -1
m = re.search("снимок страницы по состоянию на (.+?)\.</span>", pg)
if m:
archive_timestamp = timestr2timestamp(m.group(1))
code = tree.find("base").get("href").split("/")[4]
# находим __NUXT__ на странице
nuxt_js = None
for s in tree.find_all("script"):
s_text = s.get_text()
if s_text.find("__NUXT__") > -1:
nuxt_js = s_text
break
# если не нашли - ёк!
if not nuxt_js:
print (f"ERROR! No nuxt data in {fn}!")
assert nuxt_js
# выполняем js-код
nuxt_raw = js2py.eval_js(nuxt_js)
...
Gnifajio None, если нужно прям чтоб js обновил DOM, то это точно не поможет. В моём случае я выдирал кусок c __NUXT__=многоэтажный js-код, который нельзя было распарсить как json, и с помощью js2py получал питоновую структуру, идентичную оригинальной js.
Чтоб прям рендерить - это к Selenium. Но чаще всего при парсинге лучше узконаправленные решения применять: понять, что там происходит, и сделать явным образом нужные запросы. Например, если там загружается шаблон страницы без данных, а потом js загружает через API данные и подклеивает их в структуры шаблона, то можно просто выявить адрес API и его параметры и спросить всё напрямую.
Если тебе надо, чтобы JS изменил сам документ, создал какие-то теги и т.д., то можешь использовать Selenium. Запустишь через него свой код, подождёшь пока он всё сделает и можешь доставать из него что тебе надо.