необходимо выборочно экранировать html-сущности (&) - PullRequest
1 голос
/ 04 августа 2010

Я снимаю html-страницу, затем использую xml.dom.minidom.parseString () для создания объекта dom.

однако на html-странице есть '&'.Я могу использовать cgi.escape, чтобы преобразовать это в &amp;, но он также преобразует все мои HTML-теги <> в &lt;&gt;, что делает parseString () несчастным.

как мне это сделать?я бы предпочел не просто взломать его, а прямо заменить "&" s

спасибо

Ответы [ 4 ]

1 голос
/ 04 августа 2010

Для очистки попробуйте использовать библиотеку, которая может обрабатывать такие html «теговые супы», как lxml, который имеет html parser (а также выделенный html-пакет в lxml.html. ) или BeautifulSoup (вы также обнаружите, что в этих библиотеках есть и другие вещи, которые упрощают очистку / работу с html, помимо возможности обрабатывать некорректно оформленные документы: получение информации из форм , делая гиперссылки абсолютными, используя селекторы css ...)

1 голос
/ 04 августа 2010

Я бы предпочел не просто взломать его, а прямо заменить "&" s

Э-э, почему?Это то, что делает cgi.escape - фактически просто операция поиска и замены для определенных символов, которые должны быть экранированы.

Если вы хотите заменить только один символ, просто замените один символ:

yourstring.replace('&', '&amp;')

Не бейте вокруг куста.

0 голосов
/ 04 августа 2010

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

0 голосов
/ 04 августа 2010

Если вы хотите убедиться, что вы случайно не восстановили уже сбежавший & (т.е. не преобразовали &amp; в &amp;amp; или &szlig; в &amp;szlig;), вы можете

import re
newstring = re.sub(r"&(?![A-Za-z])", "&amp;", oldstring)

Это оставит & s, когда за ними следует буква.

...