Python [lxml] - 清理HTML标签

15 投票
3 回答
14228 浏览
提问于 2025-04-15 23:24
from lxml.html.clean import clean_html, Cleaner
    def clean(text):
        try:        
            cleaner = Cleaner(scripts=True, embedded=True, meta=True, page_structure=True, links=True, style=True,
                      remove_tags = ['a', 'li', 'td'])
            print (len(cleaner.clean_html(text))- len(text))
            return cleaner.clean_html(text) 
        except:
            print 'Error in clean_html'
            print sys.exc_info()
            return text

我写了上面的(看起来很糟糕的)代码,这是我刚开始接触Python时的尝试。我想用lxml cleaner来清理几个HTML页面,最终只想留下文本,其他的都不要。但是无论我怎么尝试,上面的代码似乎都没有效果,我仍然看到很多标记(而且看起来并不是损坏的HTML),特别是链接,这些链接没有被删除,尽管我在remove_tagslinks=True中使用了相关的参数。

你知道发生了什么吗?也许我在lxml上走错了方向?我以为这是在Python中解析HTML的正确方法呢?

3 个回答

5

我觉得你应该看看 Beautiful Soup 这个工具。可以参考 这篇文章 的建议,按照下面的方式去除HTML元素:

from BeautifulSoup import BeautifulSoup

''.join(BeautifulSoup(page).findAll(text=True))

这里的 page 是你的HTML字符串。

如果你需要更多的解释,可以查看 Dive into Python 上关于 HTML解析 的案例研究。

13

我不确定在你提问的时候这个方法是否已经存在,不过如果你试试下面的代码:

document = lxml.html.document_fromstring(html_text)
raw_text = document.text_content()

这样应该能给你返回整个html文档里的所有文本内容,去掉所有的格式标记。

15

来自 David 的解决方案是把文本连接在一起,没有任何分隔符:

   import lxml.html
   document = lxml.html.document_fromstring(html_string)
   # internally does: etree.XPath("string()")(document)
   print document.text_content()

但这个方法对我有帮助 - 是我需要的那种连接方式:

   from lxml import etree
   print "\n".join(etree.XPath("//text()")(document))

撰写回答