【问题标题】:BeautifulSoup - removing MS Word specific tags?BeautifulSoup - 删除 MS Word 特定标签?
【发布时间】:2014-12-02 20:01:56
【问题描述】:

我有从 MS Word 保存的 html 文档,现在它有一些与 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'],它会删除&lt;o:p&gt;&lt;/o:p&gt; 标签,但如果我添加删除html 或body 标签,它不会做任何事情,它仍然保留在那里。

附:如果我直接更改查找标签的位置,我可以在那里删除html 标签。例如,通过在方法中添加这一行(在使用 findAll 之前)soup = soup.body。但在此之后,body 标签仍然挂在那些特定的段落中。

【问题讨论】:

    标签: python html tags beautifulsoup


    【解决方案1】:

    你可以试试这个:

    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 和 body 标签。

    【讨论】:

    • 谁能告诉我为什么我的 python 代码中看不到语法高亮显示?
    • 它做同样的事情。
    • 我不知道你的目的是什么。当我用你的 html 执行 strip_tags(html, ['span', 'o:p']) 时,我可以去除这些标签。
    • 好吧,也许我的问题失控了。它应该已经删除了 MS 单词特定标签以及所有其他生成的标签。正如您在示例中看到的那样,由于某种原因出现了 body 和 html 标签并且这些标签并没有消失,我可能需要正则表达式或其他东西直接从字符串中剥离。
    • 打印如下: 这可能不是标签问题,看起来像编码问题。尝试提及 encoding ="utf-8" 它在大多数情况下都有效。但是,如果有一些类似于 MSWord 的 XML 标签,我也不知道如何删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2013-10-19
    • 1970-01-01
    相关资源
    最近更新 更多