Удалите HTML-теги в AppEngine Python Env (эквивалент Ruby Sanitize)

Я ищу модуль python, который поможет мне избавиться от тегов HTML, но сохранит текстовые значения. Я пробовал 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


person Ecognium    schedule 10.03.2010    source источник


Ответы (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).

person Alex Martelli    schedule 10.03.2010
comment
Спасибо, Алекс. Это должно сработать - в прошлый раз, когда я попробовал BeautifulSoup, я начал разбирать узел за узлом, и это стало очень медленным. Теперь, когда я изменил способ обработки своего HTML-кода, я могу использовать BeautifulSoup для очистки. Я совершенно забыл о параметре text = True. Спасибо! - person Ecognium; 10.03.2010
comment
Для использования в App Engine установите BeatifulSoup локально и используйте файл в /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages. Или просто используйте это: dl.dropbox.com/u/9632169/BeautifulSoup.py - person crizCraig; 25.04.2012

Если вы не хотите использовать отдельные библиотеки, вы можете импортировать стандартные утилиты 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 }}

Кстати, это один из самых быстрых способов.

person Mikhail Kashkin    schedule 10.03.2010
comment
Спасибо, Михаил. Я попробую. - person Ecognium; 11.03.2010

Использование 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
person bigredbob    schedule 10.03.2010
comment
Спасибо, bigredbob. Мне потребовалось время, чтобы заставить lxml работать на моей машине с вашим кодом - он работает! Я еще не тестировал его на App-Engine и дам вам знать, если он не работает. lxml, похоже, также справляется с плохой разметкой. - person Ecognium; 10.03.2010

#!/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)

Печать:

это ссылка и текст, выделенный жирным шрифтом, за которым следует изображение

person Amarghosh    schedule 10.03.2010
comment
Спасибо, Амаргош. Я думаю, что minidom поддерживается движком приложения, так что он должен хорошо работать. - person Ecognium; 10.03.2010
comment
Amarghosh, я принял ответ Алекса, поскольку BeautifulSoup, похоже, лучше справляется с плохой разметкой. Тем не менее, большое спасибо за фрагмент, и я, безусловно, могу использовать его для разметки, которой я могу доверять. - person Ecognium; 10.03.2010

Поздно, но.

Вы можете использовать Jinja2.Markup ()

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

from jinja2 import Markup 
Markup("<div>About</div>").striptags()
u'About'
person Lauro Oliveira    schedule 02.12.2013