Как сравнить два полученных .html файла с помощью Python?

Рейтинг: 1Ответов: 2Опубликовано: 21.02.2023

Суть вопроса вот в чем: есть задача, получить два .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()

Ответы

▲ 1Принят

Итоговый скрипт выглядит следующим образом (правда пришлось переделать сбор .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)
▲ 3

Я не python разработчик, но как сравнить 2 html? сравнить как строки. Эффективно? -нет. В любом случае это похоже на костыль, если вам понадобилось сравнивать 2 html документа