2010-06-01 92 views
11
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清理工来清理几个html页面,所以最后我只剩下了文本,而没有其他任何东西 - 但尝试,因为我可能,上述不似乎工作,我是还留下了标记的substial量(和它不似乎被打破HTML),特别的联系,这是没有得到清除,尽管我在remove_tags使用指定参数和links=Truepython [lxml] - 清理html标签

任何想法怎么回事,也许即时通讯与lxml吠叫错误的树?我认为这是在Python中解析HTML的方式吗?

+0

我不能使用复制的问题HTTP ://stackoverflow.com/questions/2950131/python-lxml-cleaning-out-html-tags/2950223#2950223作为输入。你能提供一个html样本和所需的输出吗? – unutbu 2010-06-01 16:45:35

+0

〜unutbu这是最奇怪的 - 我有一个完整的数据库,代码没有工作 - 但是,它现在似乎工作得很好? (你做了什么:)?) 但是,即使在它,任何想法如何也可以采取链接文本了,当删除链接(因为atm它离开链接的文本)。 – 2010-06-01 18:05:53

+0

@sadhu_:'remove_tags'本身只删除标签;它留下了孩子和文字。使用'kill_tags'去除整棵树。 – jfs 2011-10-31 15:44:57

回答

5

我想你应该检查出Beautiful Soup。从this article使用建议和剥离HTML元素以下列方式:

from BeautifulSoup import BeautifulSoup 

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

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

如果您需要进一步说明,可以查看HTML parsing上的Dive into Python案例研究。

+3

它似乎BS被弃用(和谷歌搜索似乎暗示lxml是前进的道路..)所以理想情况下,我想学习一些lxml [因为文档是温和地扑朔迷离..] – 2010-06-01 18:07:28

+0

BS岩石!有了4.0 rc(几个月前),你可以使用'lxml'或'html5lib'中的解析器并将它们包装在漂亮的BS api中。 – Sergio 2011-05-17 00:07:15

12

不知道你身边做你的问题存在的时候这个方法,但是如果你通过

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

应该返回你的HTML文档中的所有文本内容,减去所有的标记。

+0

查看罗伯特的答案如下 - 链接为懒惰http://stackoverflow.com/a/23929354/9908 – David 2014-09-14 22:18:41

8
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)) 
+1

这是更有用。 – David 2014-09-14 22:17:38