Как сохранить развёрнутый html с открытыми спойлерами?
Что Вы имеете в виду? Если задача, которую Вы перед собой ставите, сводится к тому, что Вы хотите задавать некоей программе web-адрес, и она (программа) должна сохранять в виде файла на диске html-страничку, которая находится по этому адресу в сети, при этом на страничке должны быть открыты все спойлеры, - то искомой Вами программой является
самописный парсер.
Пример, который Вы привели: необходимо в дереве DOM в элементе
table с
id='packages_list' выполнить
click на каждом элементе
a,
id которого содержит в себе текст "pub" (это действие приведет к развертыванию спойлеров), после чего сохранить innerHTML всей страницы в текстовый файл на диске (имейте в виду при этом, что для того, чтобы web-страница выглядела так же как в браузере, придется копировать отдельно стили оформления и отдельно подгружать картинки [последнее я не реализовывал]). Если я правильно понял Вашу задачу, - смотреть в данном случае следует в сторону python и selenium. Пример такого парсера под спойлером.
Чтоб работало - предварительно установите зависимости (скрипт писался с прицелом на использование firefox; может быть задействован любой иной браузер, но тогда скрипт надо модифицировать, и зависимости будут иными):sudo apt update && sudo apt install --no-install-recommends python-selenium && sudo apt install firefoxdriver firefox-geckodriver
Далее нижеприведенный код сохраните в файл на диске, например, в ~/myparser.py и вызывайте его из скрипта bash (или из терминала), передавая необходимые Вам параметры:python ~/myparser.py --url https://launchpad.net/~mrazavi/+archive/ubuntu/gvm/+packages --fname $HOME/myfile.html
Если вызвать, не передавая параметры, - скрипт будет выполнен с URL и именем файла, которые я прописал в нем по-дефолту.
Сам код парсера:
#!/usr/bin/env python
#coding=utf-8
from selenium import webdriver #работа с веб-движками вообще
import time #временная задержка
import argparse #получение аргументов из командной строки
import codecs #работа с файлами
import os #работа с операционной системой и выполнение команд bash
#процедура создания браузера и навигации на адрес
def open_firefox(url):
driver = webdriver.Firefox() #создаем подконтрольный экземпляр браузера
driver.get(url) #выполняем навигацию на адрес
return driver
#развертывание спойлеров
def actions_on_web_page(driver):
#находим и разворачиваем спойлеры на странице
table=driver.find_element_by_xpath("//table[@id='packages_list']")
for cur_spoiler in table.find_elements_by_xpath(".//a[contains(@href,'pub')]"):
cur_spoiler.click() #кликаем по спойлеру
time.sleep(0.5) #ждем полсекунды, пока прогрузится; если у Вас медленное соединение - увеличьте этот интервал времени
return driver.page_source #возвращаем исходный код страницы
#получение css стилей
def get_css(driver):
#находим ссылку на css на странице:
link=driver.find_element_by_xpath("//link[@type='text/css']")
driver.get(link.get_attribute("href")) #выполняем навигацию на адрес
return driver.page_source #возвращаем исходный код страницы
#сохранение в файл
def save_out_as_a_file(html_source, css_input, filename):
fp = codecs.open(filename, 'w', encoding='utf-8') #открываем файл для записи
fp.write('<!DOCTYPE html><html><meta charset="utf-8"><head>') #заголовок файла
fp.write('<style type="text/css">'+css_input+'</style>') #стили
fp.write('</head><body>'+html_source+'</body></html>') #сам код тела
fp.close() #закрытие файла
#Сама программа (разбираем аргументы, и вызываем парсер):
if __name__ == '__main__':
#разбираем аргументы командной строки
callWith=argparse.ArgumentParser()
callWith.add_argument('--url', help='web-адрес')
callWith.add_argument('--fname', help='полное имя файла, куда сохранять результат')
args = callWith.parse_args()
if args.url == None:
print("URL не передан; берем дефолтный")
URL="https://launchpad.net/~mrazavi/+archive/ubuntu/gvm/+packages"
else:
URL=args.url
if args.fname == None:
print("Имя файла не передано; берем дефолтное")
fname=os.getenv('HOME')+'/launchpad_mrazavi.html'
else:
fname=args.fname
print("Выполняется парсирование "+URL+" с сохранением в файл "+fname+"...")
browser=open_firefox(URL) #Открываем браузер, выполняем навигацию
result=actions_on_web_page(browser) #Развертываем спойлеры, получаем исходный код
styles=get_css(browser) #Копируем стили
browser.quit() #браузер больше не нужен - закрываем
save_out_as_a_file(result,styles,fname) #Генерируем html-файл, сохраняем его на диске
print("Парсирование завершено, файл сохранен")