Как сравнить два полученных .html файла с помощью Python?
Суть вопроса вот в чем: есть задача, получить два .html с одной и той же странички, записать их в разные файлы 1 и 2 соответственно. После чего сопоставить друг с другом, на предмет различий в html и все изменения записать в отдельный третий файл. Данная схема должна быть реализована на Python с использованием Selenium в виде автотеста. Для отслеживания изменений в разметке (если вдруг то то правил на горячую без гита).
Как итог, собрал скрипт (представлен ниже). Но столкнулся с рядом проблемм при попытке сравнить два файла. Перерыл несколько тем в интернете, но увы безысходно. Отсюда возник вопрос, а вообще реально ли такое реализовать? Возможно у кого то есть опыт?
Код проекта:
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from htmldiff import render_html_diff
from xml.etree import ElementTree as ET
def get_dom_tree(url, filename):
# Создаем экземпляр браузера
driver = webdriver.Chrome()
driver.get(url)
# Получаем содержимое страницы
page_source = driver.page_source
# Закрываем браузер
driver.quit()
# Парсим HTML с помощью BeautifulSoup
soup = BeautifulSoup(page_source, 'html.parser')
# Записываем результат в файл
with open(filename, 'w') as file:
file.write(soup.prettify())
def parse_html_to_tree(html):
return ET.fromstring(html)
def compare_dom_trees(old_file, new_file, diff_file):
# Читаем содержимое файлов
with open(old_file, 'r', encoding='utf-8') as file:
old_tree = parse_html_to_tree(file.read())
with open(new_file, 'r', encoding='utf-8') as file:
new_tree = parse_html_to_tree(file.read())
# Сравниваем два DOM дерева
diff = render_html_diff(old_tree, new_tree)
# Записываем разницу в файл
with open(diff_file, 'w', encoding='utf-8') as file:
file.write(diff)
def main():
# Задаем URL
url = ''
# Получаем первое DOM дерево
old_file = 'old.html'
get_dom_tree(url, old_file)
# Ждем 2 минуты
time.sleep(10)
# Получаем второе DOM дерево
new_file = 'new.html'
get_dom_tree(url, new_file)
# Сравниваем два DOM дерева и записываем разницу в файл
diff_file = 'diff.html'
compare_dom_trees(old_file, new_file, diff_file)
if __name__ == '__main__':
main()
Ответы (2 шт):
Я не python разработчик, но как сравнить 2 html? сравнить как строки. Эффективно? -нет. В любом случае это похоже на костыль, если вам понадобилось сравнивать 2 html документа
Итоговый скрипт выглядит следующим образом (правда пришлось переделать сбор .html в .txt) возможно кому нибудь пригодится:
import time
import difflib
from selenium import webdriver
from colorama import Fore, Style
# открываем браузер и заходим на URL
url = ""
driver = webdriver.Chrome()
driver.get(url)
# получаем код страницы и сохраняем его в txt-файл
page_source = driver.page_source
with open("file1.txt", "w") as f:
f.write(page_source)
# ждем 2 минуты
time.sleep(30)
# получаем обновленный код страницы и сохраняем его в другой txt-файл
driver.refresh()
page_source_updated = driver.page_source
with open("file2.txt", "w") as f:
f.write(page_source_updated)
# закрываем браузер
driver.quit()
# преобразуем содержимое txt-файлов в строки
with open("file1.txt", "r") as f1, open("file2.txt", "r") as f2:
content1 = f1.read()
content2 = f2.read()
# сравниваем содержимое файлов и записываем различия в файл diff.txt
with open("diff.txt", "w") as f:
if content1 == content2:
f.write("Files are identical")
else:
diff = difflib.unified_diff(content1.splitlines(), content2.splitlines(), fromfile='file1.txt', tofile='file2.txt')
f.write('\n'.join(diff))
# открываем файл с различиями
with open("diff.txt", "r") as f:
diff_content = f.readlines()
# выделяем измененные строки цветом
with open("diff_colored.txt", "w") as f:
for line in diff_content:
if line.startswith("+"):
f.write(Fore.GREEN + line + Style.RESET_ALL)
elif line.startswith("-"):
f.write(Fore.RED + line + Style.RESET_ALL)
else:
f.write(line)