Вы не можете. ElementTree работает, загружая XML, анализируя его и сохраняя только абстрактное представление. Он записывает это в строку, просматривая абстрактное представление, но не запоминает такие вещи, как то, какие символы были экранированы как сущности, или был ли элемент сохранен как <foo/>
или <foo></foo>
(HTML: <foo>
или <foo></foo>
)
Теперь, поскольку ElementTree работает только с XML (не HTML), я предполагаю, что вы работаете с lxml.html - в этом случае он фактически автоматически исправляет определенные формы ошибочного HTML, потому что в противном случае он не смог бы правильно его сохранить.
Правильный способ обработки HTML, данные которого вы хотите полностью сохранить, за исключением того, как вы их изменяете, - это захватить его в токенах, которые запоминают их исходное представление. Я сделал это с помощью sgmllib, но это несовершенно - например, есть get_starttag_text
метод для получения точного содержимого начального тега, но нет соответствующего метода для конечных тегов. В любом случае этого может быть достаточно.
Например, чтобы написать HTML, в котором удалены все абзацы, можно написать такую функцию:
from cStringIO import StringIO
class SGMLModifier(sgmllib.SGMLParser):
def __init__(self, *args, **kwargs):
sgmllib.SGMLParser.__init__(self, *args, **kwargs)
self._file = StringIO()
def getvalue(self):
return self._file.getvalue()
def start_b(self, attributes):
# skip it
pass
def end_b(self):
# skip it
pass
def unknown_starttag(self, tag, attributes):
self._file.write(self.get_starttag_text())
def unknown_endtag(self, tag):
# we can't get this verbatim.
self._file.write('</%s>' % tag)
def handle_comment(self, comment):
# no verbatim here either.
self._file.write('<!-- %s -->' % comment)
def handle_data(self, data):
self._file.write(data)
def convert_entityref(self, ref):
return '&' + ref + ';'
def remove_bold(html):
parser = SGMLModifier()
parser.feed(html)
return parser.getvalue()
Это может потребовать немного больше работы, чтобы не искажать ввод. Подробности обо всем читайте в документации.
person
Devin Jeanpierre
schedule
07.09.2011