python [lxml] - 清理html标签

sad*_*hu_ 14 python parsing lxml

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
Run Code Online (Sandbox Code Playgroud)

我将上面(丑陋的)代码放在一起作为我最初进入python土地的代码.我正在尝试使用lxml清理器来清理几个html页面,所以最后我只剩下文本而没有别的 - 但试试我可能,上面似乎没有这样工作,我是仍然留下了一定数量的标记(它似乎没有被破坏的html),特别是链接,它们没有被删除,尽管我使用的是args remove_tagslinks=True

任何想法发生了什么,也许我用lxml咆哮错误的树?我认为这是在python中进行html解析的方法吗?

Dav*_*vid 13

不确定这个方法是否在您提出问题时存在,但如果您通过

document = lxml.html.document_fromstring(html_text)
raw_text = document.text_content()
Run Code Online (Sandbox Code Playgroud)

这应该返回html文档中的所有文本内容,减去所有标记.


Rob*_*ujo 13

大卫的解决方案连接文本没有分隔符:

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

但是这个帮了我 - 连接我需要的方式:

   from lxml import etree
   print "\n".join(etree.XPath("//text()")(document))
Run Code Online (Sandbox Code Playgroud)


Kus*_*alP 5

我想你应该看看美丽的汤.使用本文中的建议并以下列方式剥离HTML元素:

from BeautifulSoup import BeautifulSoup

''.join(BeautifulSoup(page).findAll(text=True))
Run Code Online (Sandbox Code Playgroud)

page你的html字符串在哪里?

如果您需要进一步说明,可以查看有关HTML解析的Dive into Python案例研究.

  • 似乎BS被弃用了(谷歌搜索似乎暗示lxml是前进的方式..)所以理想情况下我想学习一些lxml [因为文档有点令人困惑......] (3认同)