С помощью 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)