python[lxml]-清除html标记

python[lxml]-清除html标记,python,parsing,lxml,Python,Parsing,Lxml,我将上述(难看的)代码放在一起,作为我对python领域的首次尝试。我正在尝试使用lxml cleaner来清理几个html页面,所以最后我只剩下文本,其他什么都没有-但是尽管我可能尝试,上面的内容似乎不起作用,我仍然留下了大量的标记(而且它似乎没有被破坏的html),特别是没有被删除的链接,尽管我在remove_tags和links=True 知道发生了什么吗,也许我用lxml找错了方向?我认为这是用python进行html解析的方法?我想你应该看看。使用来自HTML元素的建议,并按以下方式剥

我将上述(难看的)代码放在一起,作为我对python领域的首次尝试。我正在尝试使用lxml cleaner来清理几个html页面,所以最后我只剩下文本,其他什么都没有-但是尽管我可能尝试,上面的内容似乎不起作用,我仍然留下了大量的标记(而且它似乎没有被破坏的html),特别是没有被删除的链接,尽管我在
remove_tags
links=True


知道发生了什么吗,也许我用lxml找错了方向?我认为这是用python进行html解析的方法?

我想你应该看看。使用来自HTML元素的建议,并按以下方式剥离HTML元素:

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
其中
page
是您的html字符串


如果您需要进一步的澄清,您可以查看上的深入Python案例研究。

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

from BeautifulSoup import BeautifulSoup

''.join(BeautifulSoup(page).findAll(text=True))
这将返回html文档中的所有文本内容,减去所有标记。

解决方案将不带分隔符的文本连接起来:

document = lxml.html.document_fromstring(html_text)
raw_text = document.text_content()
但这一个帮助了我-以我需要的方式连接:

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

我无法使用作为输入复制问题。你能提供一个html示例和所需的输出吗?~unutbu这是最奇怪的——我有一个完整的数据库,其中的代码不起作用——然而,它现在似乎工作得很好?(你做了什么:)?)但是当我在做的时候,你知道在删除链接的时候,你怎么也可以把链接文本拿出来吗(因为atm会把链接文本留在里面)。@sadhu:
remove\u tags
只删除标签本身;它留下了它的子对象和文本。使用
kill_tags
删除整个树。看起来BS已经被弃用了(谷歌似乎建议lxml是前进的方向……),所以理想情况下我想学习一些lxml[因为文档有点让人困惑……]BS rocks!随着4.0 rc的推出(几个月前),您可以使用
lxml
html5lib
中的解析器,并将它们封装在尼斯BS api中。这非常有用。请查看下面的Robert答案-链接了解懒惰
   from lxml import etree
   print "\n".join(etree.XPath("//text()")(document))