Lxml (или lxml.html): структура дерева печати

Я хотел бы напечатать древовидную структуру etree (образованную из html-документа) дифференцируемым образом (это означает, что две этики должны печататься по-разному).

Что я подразумеваю под структурой, это "форма" дерева, что в основном означает все теги, но не атрибут и текстовое содержимое.

Любая идея? Есть что-то в lxml для этого?

Если нет, я думаю, мне нужно пройти через все дерево и построить из него строку. Любая идея, как представлять дерево в компактном виде? ( "компактная" функция менее актуальна)

FYI не предназначен для просмотра, но для хранения и хэширования, чтобы иметь возможность делать различия между несколькими шаблонами html.

Спасибо

Ответ 1

Возможно, просто запустите XSLT поверх исходного XML, чтобы удалить все, кроме тегов, тогда достаточно просто использовать etree.tostring, чтобы получить строку, которую вы могли бы хэш...

from lxml import etree as ET

def pp(e):
    print ET.tostring(e, pretty_print=True)
    print

root = ET.XML("""\
<project id="8dce5d94-4273-47ef-8d1b-0c7882f91caa" kpf_version="4">
<livefolder id="8744bc67-1b9e-443d-ba9f-96e1d0007ba8" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8">Mooo</livefolder>
<livefolder id="8744bc67-1b9e-443d-ba9f" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8" />
<preference-set idref="8dce5d94-4273-47ef-8d1b-0c7882f91caa">
  <boolean id="import_live">0</boolean>
</preference-set>
</project>
""")
pp(root)


xslt = ET.XML("""\
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates select="*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
""")
tr = ET.XSLT(xslt)

doc2 = tr(root)
root2 = doc2.getroot()
pp(root2)

Выдает результат:

<project id="8dce5d94-4273-47ef-8d1b-0c7882f91caa" kpf_version="4">
  <livefolder id="8744bc67-1b9e-443d-ba9f-96e1d0007ba8" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8">Mooo</livefolder>
  <livefolder id="8744bc67-1b9e-443d-ba9f" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8"/>
  <preference-set idref="8dce5d94-4273-47ef-8d1b-0c7882f91caa">
    <boolean id="import_live">0</boolean>
  </preference-set>
</project>

<project>
  <livefolder/>
  <livefolder/>
  <preference-set>
    <boolean/>
  </preference-set>
</project>