【问题标题】:Remove HTML tags in AppEngine Python Env (equivalent to Ruby's Sanitize)移除 AppEngine Python Env 中的 HTML 标签(相当于 Ruby 的 Sanitize)
【发布时间】:2011-01-25 18:42:29
【问题描述】:

我正在寻找一个可以帮助我摆脱 HTML 标记但保留文本值的 python 模块。我之前尝试过 BeautifulSoup,但我不知道如何完成这个简单的任务。我尝试搜索可以执行此操作的 Python 模块,但它们似乎都依赖于在 AppEngine 上无法正常运行的其他库。

下面是来自 Ruby 清理库的示例代码,这就是我在 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

【问题讨论】:

    标签: python google-app-engine html-sanitizing


    【解决方案1】:

    晚了,但是。

    你可以使用 Jinja2.Markup()

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

    from jinja2 import Markup 
    Markup("<div>About</div>").striptags()
    u'About'
    

    【讨论】:

      【解决方案2】:

      如果您不想使用单独的库,那么您可以导入标准的 django 工具。例如:

      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 }}
      

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

      【讨论】:

      • 谢谢,米哈伊尔。我会试一试。
      【解决方案3】:
      #!/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)
      

      打印:

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

      【讨论】:

      • 谢谢阿马戈什。我认为 app-engine 支持 minidom,所以应该可以正常工作。
      • Amarghosh,我接受了 Alex 的回答,因为 BeautifulSoup 似乎可以更好地处理不良标记。非常感谢 sn-p,但是我当然可以将它用于我可以信任的标记。
      【解决方案4】:
      >>> 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)

      【讨论】:

      • 谢谢,亚历克斯。这应该可行——上次我尝试 BeautifulSoup 时,我开始逐节点解析,这变得非常慢。现在我已经改变了处理 HTML 代码的方式,我可以使用 BeautifulSoup 进行清理。我完全忘记了 text=True 选项。谢谢!
      • 要在 App Engine 中使用,请在本地安装 BeatifulSoup 并使用 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages 中的文件。或者只是使用这个:dl.dropbox.com/u/9632169/BeautifulSoup.py
      【解决方案5】:

      使用 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
      

      【讨论】:

      • 谢谢,bigredbob。我花了一段时间让 lxml 在我的机器上运行到您的代码 - 它有效!我尚未在 App-Engine 上对其进行测试,如果它不起作用,我会通知您。 lxml 似乎也可以管理错误的标记。
      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2019-07-04
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多