Форум сайта python.su
16
Здравствуйте! Библиотека lxml по-умолчанию экранирует теги, если они встречаются в атрибуте text элемента.
from lxml import etree tree = etree.HTML('<div></div>') div = tree.xpath('//div')[0] div.text = '<p></p>' print(etree.tostring(tree, pretty_print=True).decode())
<html> <body> <div><p></p></div> </body> </html>
<html> <body> <div><p></p></div> </body> </html>
Отредактировано Stright (Май 18, 2017 16:52:26)
Офлайн
857
С html-документом надо работать через lxml.html, потому что html хоть и похож на xml, но не является его подмножеством (нельзя считать, что html - это такой суженный xml).
>>> from lxml import html >>> >>> doc = html.document_fromstring('<div></div>') >>> >>> div = doc.xpath('//div')[0] >>> div.append(html.Element('p')) >>> >>> print(html.tostring(doc, pretty_print=True, encoding='unicode')) <html><body><div><p></p></div></body></html> >>>
Отредактировано py.user.next (Май 19, 2017 00:14:53)
Офлайн
16
Да, просто тег добавить можно, как дочерний элемент, а если мне надо добавить не тег, а шаблон, что-то вроде:
'{% if name %}<p>{{name}}</p>{% endif %}'
<html> <body> <div>{% if name %}<p>{{name}}</p>{% endif %}</div> </body> </html>
Отредактировано Stright (Май 19, 2017 00:15:41)
Офлайн
857
>>> from lxml import html >>> >>> doc = html.document_fromstring('<div></div>') >>> >>> div = doc.xpath('//div')[0] >>> div.append(html.Element('p')) >>> div[0].text = '{pattern1}' >>> >>> pat = html.tostring(doc, pretty_print=True, encoding='unicode') >>> out = pat.format(pattern1='<x>') >>> out '<html><body><div><p><x></p></div></body></html>\n' >>>
Отредактировано py.user.next (Май 19, 2017 00:34:39)
Офлайн
16
А pretty_print вообщем-то и не нужен, результат будет промежуточным и читаться никем не будет. Задача, конечно, сильно упрощена для ясности, но, кажется, это то, что нужно, буду пробовать. Спасибо большое за идею!
Офлайн