1

我正在寻找一个可以帮助我摆脱 HTML 标记但保留文本值的 python 模块。我之前尝试过 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

4

5 回答 5

5
>>> 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).

于 2010-03-10T06:59:51.657 回答
4

如果您不想使用单独的库,那么您可以导入标准 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 }}

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

于 2010-03-10T16:42:27.713 回答
1

使用 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
于 2010-03-10T06:59:10.880 回答
1
#!/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)

印刷:

这是一个链接和一些粗体文字,后跟一张图片

于 2010-03-10T07:00:52.570 回答
1

晚了,但是。

您可以使用 Jinja2.Markup()

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

from jinja2 import Markup 
Markup("<div>About</div>").striptags()
u'About'
于 2013-12-02T13:29:47.840 回答