Я работаю над массовым преобразованием нескольких HTML-файлов в XML с помощью BeautifulSoup в Python.Как заменить комментарии HTML пользовательскими <comment> элементами
Образец HTML-файл выглядит примерно так:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- this is an HTML comment -->
<!-- this is another HTML comment -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
...
<!-- here is a comment inside the head tag -->
</head>
<body>
...
<!-- Comment inside body tag -->
<!-- Another comment inside body tag -->
<!-- There could be many comments in each file and scattered, not just 1 in the head and three in the body. This is just a sample. -->
</body>
</html>
<!-- This comment is the last line of the file -->
Я понял, как найти доктайп и заменить его с тегом <doctype>...</doctype>
, но комментирование дает мне много разочарований. Я хочу заменить комментарии HTML <comment>...</comment>
. В этом примере HTML я смог заменить первые два комментария HTML, но ничего внутри тега html
и последнего комментария после закрытия html-тега я не был.
Вот мой код:
file = open ("sample.html", "r")
soup = BeautifulSoup(file, "xml")
for child in soup.children:
# This takes care of the first two HTML comments
if isinstance(child, bs4.Comment):
child.replace_with("<comment>" + child.strip() + "</comment>")
# This should find all nested HTML comments and replace.
# It looks like it works but the changes are not finalized
if isinstance(child, bs4.Tag):
re.sub("(<!--)|(<!--)", "<comment>", child.text, flags=re.MULTILINE)
re.sub("(-->)|(--&gr;)", "</comment>", child.text, flags=re.MULTILINE)
# The HTML comments should have been replaced but nothing changed.
print (soup.prettify(formatter=None))
Это мой первый раз, используя BeautifulSoup. Как использовать BeautifulSoup для поиска и замены всех комментариев HTML с помощью тега <comment>
?
Могу ли я преобразовать его в поток байтов через pickle
, сериализуя его, применяя регулярное выражение, а затем повторно обработайте его до объекта BeautifulSoup
? Будет ли это работать или просто вызвать больше проблем?
Я попытался использовать рассол на объекте дочернего тега, но десериализация завершилась неудачей с TypeError: __new__() missing 1 required positional argument: 'name'
.
Затем я попытался протравить только текст тега, используя child.text
, но десериализация не удалась из-за AttributeError: can't set attribute
. В основном, child.text
доступен только для чтения, что объясняет, почему регулярное выражение не работает. Итак, я не знаю, как изменить текст.
не приведет к плохой сформированный 'xml' файл применяется только все изменения? – Birei
Я не знаю, но 'Chilkat' имеет (не бесплатную) библиотеку python для преобразования HTML-to-XML, которая преобразует все комментарии HTML в'' и файл XML выглядит хорошо. –
user3621633