У меня есть html-документ, который был сохранен из MS Word, и теперь у него есть некоторые теги, связанные с MS Word. Мне не нужно слишком поддерживать обратную совместимость с ним, мне просто нужно извлечь содержимое из этого файла. Проблема в том, что теги, специфичные для слов, не удаляются так легко.BeautifulSoup - удаление тегов MS Word?
У меня есть этот код:
from bs4 import BeautifulSoup, NavigableString
def strip_tags(html, invalid_tags):
soup = BeautifulSoup(html)
for tag in soup.findAll(True):
if tag.name in invalid_tags:
s = ""
for c in tag.contents:
if not isinstance(c, NavigableString):
c = strip_tags(unicode(c), invalid_tags)
s += unicode(c)
tag.replaceWith(s)
return soup
Это удаляет не нужны теги. Но некоторые из них остаются даже после использования этого метода. Например посмотрите на это:
<P class="MsoNormal"><SPAN style="mso-bidi-font-weight: bold;">Some text -
some content<o:p></o:p></SPAN></P>
<P class="MsoNormal"><SPAN style="mso-bidi-font-weight: bold;">some text2 -
647894654<o:p></o:p></SPAN></P>
<P class="MsoNormal"><SPAN style="mso-bidi-font-weight: bold;">some text3 -
some content blabla<o:p></o:p></SPAN></P>
Вот как он выглядит внутри HTML документа. Когда я использую метод как это:
invalid_tags = ['span']
stripped = strip_tags(html_file, invalid)
print stripped
Он печатает так:
<p class="MsoNormal">Some text -
some content<html><body><o:p></o:p></body></html></p>
<p class="MsoNormal">some text2 -
647894654<html><body><o:p></o:p></body></html></p>
<p class="MsoNormal">some text3 -
some content blabla<html><body><o:p></o:p></body></html></p>
Как вы можете видеть, по какой-то причине html
body
и теги появились там, даже если в HTML не существует. Если я добавлю invalid_tags = ['span', 'o:p']
, он удалит <o:p></o:p>
теги, но если я добавлю для удаления тегов html или body, он ничего не сделает, и он все равно сохраняется.
P.S. Я могу удалить теги html
там, если я напрямую изменю место поиска меток. Например, добавив эту строку в метод (до использования findAll
) soup = soup.body
. Но все же после этого в этих конкретных пунктах сохраняются теги body
.
Кто может сказать мне, почему я не вижу подсветку синтаксиса в моем коде на Python? – xcaptain
Он делает то же самое. – Andrius
Я не знаю, для чего вы предназначены. когда я выполняю strip_tags (html, ['span', 'o: p']) с вашим html, я могу разбить эти теги. – xcaptain