Как разбить большой файл HTML на несколько файлов, не нарушая теги? - PullRequest
1 голос
/ 27 мая 2020

У меня есть загруженный чат Discord с 50к сообщений. Размер файла составляет 210 МБ, и он выглядит так:

    <head>...</head>
    <body>
        <div class="chatlog">
            <div class="chatlog_message-group">
                <div class="chatlog_messages">
                    <div class="chatlog_message">
                        <div class="chatlog_embed">
                        CONTENT
                        </div>
                    </div>
                </div>
            </div>
            <div class="chatlog_message-group">
                <div class="chatlog_messages">
                    <div class="chatlog_message">
                        <div class="chatlog_embed">
                        CONTENT
                        </div>
                    </div>
                </div>
            </div>
        </div>
        ...
    </body>

Моя цель - разбить файл на несколько файлов, не нарушая при этом теги HTML.

РЕДАКТИРОВАТЬ: Итак, после обработки, Я бы хотел, чтобы file1. html выглядел как this , file2. html выглядел как this и т. Д.

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

С помощью Python это можно сделать довольно просто:

from __future__ import print_function
from lxml import etree, html
from io import StringIO
from pathlib import Path

parser = html.HTMLParser()

header= "<html><body>\n";
footer = "</body></html>\n";
i = 1;

file = "chatlog.html"

try:
    tree = html.parse(StringIO(Path(file).read_text()), parser)

    try:
    # target and print all <div class="chatlog_message-group"> elements and subelements
        for element in tree.xpath('//div[@class="chatlog_message-group"]'):
            # create and open a new file for writing
            f = open("chat" + str(i) + ".html", "w+")

            # retrieve the HTML outerHTML of the current element
            f.write(header + etree.tostring(element, pretty_print=True).decode("utf-8") + footer)
            f.close()
            i += 1

    except etree.XPathEvalError as details:
        print ('ERROR: XPath expression', details.error_log)

except etree.XMLSyntaxError as details:
    print ('ERROR: parser', details.error_log)

Пакеты, упомянутые в первых строках кода, должны быть установлены через «pip» ( Установщик пакета для Python), который задокументирован здесь .

Обратите внимание, что вся часть HEAD не будет присутствовать в целевых файлах. Если вам нужно добавить таблицы стилей и т. Д. c., Либо сделайте это вручную внутри переменной header, либо вам нужно будет настроить скрипт, чтобы сначала извлечь HTML head и добавить это перед добавлением HTML содержимое каждого файла.


Несколько сообщений в файле

Несколько сообщений можно добавить в один файл с помощью оператора % (по модулю). Просто установите переменную messagesPerFile на количество сообщений, которые будут включены в один файл, и вы можете go.

Обновленный код

from __future__ import print_function
from lxml import etree, html
from io import StringIO
from pathlib import Path

parser = html.HTMLParser()

header= "<html><body>\n"
footer = "</body></html>\n"
i = 1
fi = 1

messagesPerFile = 3

file = "chatlog.html"

buffer = ""

try:
    tree = html.parse(StringIO(Path(file).read_text()), parser)

    try:
    # target and print all <div class="collectionDiv"> elements and subelements
        for element in tree.xpath('//div[@class="chatlog_message-group"]'):

            buffer += etree.tostring(element, pretty_print=True).decode("utf-8")

            if i % messagesPerFile == 0 and i > 0:   
                f = open("chat" + str(fi) + ".html", "w+")
                f.write(header + buffer + footer)
                f.close()
                fi+=1
                buffer = ""

            i+=1
        # if remaining elements are still in the buffer, write them out
        if buffer != "":
            f = open("chat" + str(fi) + ".html", "w+")
            f.write(header + buffer + footer)
            f.close()

    except etree.XPathEvalError as details:
        print ('ERROR: XPath expression', details.error_log)

except etree.XMLSyntaxError as details:
    print ('ERROR: parser', details.error_log)
0 голосов
/ 27 мая 2020

Один из подходов - создать окончательный файл из серии включает .

Например, используя PHP - доступны другие языки сценариев на стороне сервера - ваш Главный файл может выглядеть так:

<?php

echo '

  <html>
  <head>...</head>
  <body>
      <div class="chatlog">
      ';

      include $_SERVER['DOCUMENT_ROOT'].'/chatlogs/chatlog-1.php';
      include $_SERVER['DOCUMENT_ROOT'].'/chatlogs/chatlog-2.php';

      echo '
      </div>
    ...
  </body>
  </html>
';

?>

, а ваши включения могут выглядеть так:

chatlog-1. php

    <div class="chatlog_message-group">
        <div class="chatlog_messages">
            <div class="chatlog_message">
                <div class="chatlog_embed">
                CONTENT 1
                </div>
            </div>
        </div>
    </div>

чат-2. php

    <div class="chatlog_message-group">
        <div class="chatlog_messages">
            <div class="chatlog_message">
                <div class="chatlog_embed">
                CONTENT 2
                </div>
            </div>
        </div>
    </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...