December 20, 2022

Как мне удалось быстро извлечь скрытое содержимое веб-страницы с 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])

Теперь можно просматривать файлы в любой Jupyter среде.