2014-10-08 2 views
1

У меня есть 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&lt;html&gt;&lt;body&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/body&gt;&lt;/html&gt;</p> 
<p class="MsoNormal">some text2 - 
647894654&lt;html&gt;&lt;body&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/body&gt;&lt;/html&gt;</p> 
<p class="MsoNormal">some text3 - 
some content blabla&lt;html&gt;&lt;body&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/body&gt;&lt;/html&gt;</p> 

Как вы можете видеть, по какой-то причине htmlbody и теги появились там, даже если в HTML не существует. Если я добавлю invalid_tags = ['span', 'o:p'], он удалит <o:p></o:p> теги, но если я добавлю для удаления тегов html или body, он ничего не сделает, и он все равно сохраняется.

P.S. Я могу удалить теги html там, если я напрямую изменю место поиска меток. Например, добавив эту строку в метод (до использования findAll) soup = soup.body. Но все же после этого в этих конкретных пунктах сохраняются теги body.

ответ

0

вы можете попробовать это:

from bs4 import BeautifulSoup 
def strip_tags(html, invalid_tags): 
    soup = BeautifulSoup(html) 
    for t in invalid_tags: 
     tag = soup.find_all(t) 
     if tag: 
      for item in tag: 
       item.unwrap() 
    return str(soup) 

то вам просто необходимо раздеться HTML и тело тега.

+0

Кто может сказать мне, почему я не вижу подсветку синтаксиса в моем коде на Python? – xcaptain

+0

Он делает то же самое. – Andrius

+0

Я не знаю, для чего вы предназначены. когда я выполняю strip_tags (html, ['span', 'o: p']) с вашим html, я могу разбить эти теги. – xcaptain

Смежные вопросы