Как запретить BeautifulSoup самозакрывающимся вещам, которые выглядят как теги, но не являются? - PullRequest
2 голосов
/ 14 января 2012

Я использую BeautifulSoup для экранирования всех тегов HTML (за исключением набора предварительно утвержденных тегов, таких как a) из произвольного набора текста.Однако я хочу, чтобы теги экранировались только в том случае, если они являются действительными тегами HTML.Если что-то выглядит как тег, но это не так, в итоге добавляется некоторый HTML-код для его закрытия, чего я не хочу.

Пример: если кто-то вводит текст <integer>, мой кодзаканчивается выплевыванием &lt;integer&gt;&lt;/integer&gt; вместо &lt;integer&gt;

Вот код (value - строка HTML, а VALID_TAGS - просто список допустимых имен тегов).

soup = BeautifulSoup.BeautifulSoup(
  value, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
# Loop through all the tags. If it is invalid, escape the characters.
for tag in soup.findAll():
  if tag.name not in VALID_TAGS:
    tag.replaceWith(cgi.escape(str(tag)))
return soup.renderContents()

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 января 2012

Понял это, используя html5lib на основе этого ответа в качестве отправной точки. Вот версия, с которой я столкнулся, которая делает то же самое, что и код BeautifulSoup, с которого я начал выше, за исключением того, что он работает правильно для описанного мной случая <integer>:

p = html5lib.HTMLParser(tokenizer=sanitizer.HTMLSanitizer, tree=treebuilders.getTreeBuilder("dom"))
dom_tree = p.parseFragment(value)
walker = treewalkers.getTreeWalker("dom")
stream = walker(dom_tree)
s = serializer.htmlserializer.HTMLSerializer(quote_attr_values=True)
return s.render(stream)

Спасибо всем, кто помог.

0 голосов
/ 14 января 2012

Вы делаете это неправильно (тм).BeatifulSoup не предназначен для такого использования.Взгляните на это вместо этого: http://code.activestate.com/recipes/52281-strip-tags-and-javascript-from-html-page-leaving-o/ Этот рецепт удаляет недействительные теги, и вы говорите так, будто хотите сохранить их, но сбежали.Должна быть довольно простая модификация.

...