Как мне удалось быстро извлечь скрытое содержимое веб-страницы с Python
Работая с веб-страницами, помните, что знания Python вам сильно пригодятся при необходимости извлечь труднодоступное содержимое, в том числе намеренно скрытое. Так, мне удалось получить исходный код Jupyter блокнота, который передавался в словаре как параметр одной из функций.
Стандартом де-факто при парсинге веб-страниц является библиотека BeautifulSoup, о которой я неоднократно писал ранее. Однако не редко встречаются задачи, с которыми легко справиться, имея только базовые знания о Python.
В моем конкретном примере нужный код располагался в json строке с ключом notebook. Начало фрагмента имеет следующий вид:
В голову пришло два решения задачи: найти идентификаторы начала, конца ноутбука и считать между ними или начать с первой скобки '{' и считать все до ее завершающей пары. Сначала считаем содержимое файла (сохранил страницу локально):
with open('/content/drive/MyDrive/hw/text.html') as f: text = f.read()
Считываем содержимое между двумя идентификационными частями
Первым способом я нашел уникальные подстроки начала и конца, "рядом" с которыми располагались символы старта и завершения json строки:
start = text.find(r'"notebook":') start_add = text[start:].find(r'{') end = text.find(r'"nbformat_minor":') end_add = text[end:].find(r'}') with open('nb.ipynb', 'wt') as f: f.write(text[start+start_add:end+end_add+1])
Считывание содержимого между парой скобок
Во втором способе я написал цикл поиска парной скобки (та, после которой счетчики вхождений "{" и "}" сравняются):
l_num = 0 r_num = 0 start_ind = 0 end_ind = 0 start = text.find(r'"notebook":') text_part = text[start:] for num, s in enumerate(text_part): if s=='{': l_num = l_num + 1 if l_num==1: start_ind = num if s=='}': r_num = r_num + 1 if start_ind>0 and l_num==r_num: end_ind = num break with open('nb2.ipynb', 'wt') as f: f.write(text_part[start_ind:end_ind+1])