我要寻找一个Python模块,这将帮助我摆脱的HTML标签,但保留文本值。我试图BeautifulSoup之前,我无法弄清楚如何做到这一点简单的任务。我试图寻找Python模块,可以做到这一点,但他们似乎都依赖于它不AppEngine上很好地工作其他库。

下面是Ruby的sanitize方法库中的样本代码,这就是我是什么后,在Python:

require 'rubygems'
require 'sanitize'

html = '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg" />'

Sanitize.clean(html) # => 'foo'

感谢您的建议。

-e

有帮助吗?

解决方案

>>> import BeautifulSoup
>>> html = '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg" />'
>>> bs = BeautifulSoup.BeautifulSoup(html)  
>>> bs.findAll(text=True)
[u'foo']

这给你的(Unicode)的字符串列表。如果你想要把它变成一个字符串,使用''.join(thatlist)

其他提示

如果你不希望使用独立的库,那么你可以导入标准的Django utils的。例如:

from django.utils.html import strip_tags
html = '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg'
stripped = strip_tags(html)
print stripped 
# you got: foo

此外它已经包含在Django模板,所以你不需要别的,只使用过滤器,这样的:

{{ unsafehtml|striptags }}

顺便说一句,这是最快的方法之一。

使用LXML:

htmlstring = '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg" />'

from lxml.html import fromstring

mySearchTree = fromstring(htmlstring)

for item in mySearchTree.cssselect('a'):
    print item.text
#!/usr/bin/python

from xml.dom.minidom import parseString

def getText(el):
    ret = ''
    for child in el.childNodes:
        if child.nodeType == 3:
            ret += child.nodeValue
        else:
            ret += getText(child)
    return ret

html = '<b>this is <a href="http://foo.com/">a link </a> and some bold text  </b> followed by <img src="http://foo.com/bar.jpg" /> an image'
dom = parseString('<root>' + html + '</root>')
print getText(dom.documentElement)

打印:

  

这是一个链接和一些粗体文本,接着通过图像

晚,但

可以使用Jinja2.Markup()

http://jinja.pocoo.org/docs/api/# jinja2.Markup.striptags

from jinja2 import Markup 
Markup("<div>About</div>").striptags()
u'About'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top