Как да създадете виртуален root с ElementTree на Python?

Опитвам се да използвам ElementTree на Python за генериране на XHTML файл.

Обаче ElementTree.Element() просто ми позволява да създам един етикет (напр. HTML). Трябва да създам някакъв вид виртуален root или както там се нарича, за да мога да поставя различните , DOCTYPES и т.н.

Как да направя това? Благодаря


person Uri    schedule 01.07.2009    source източник


Отговори (2)


Не знам дали има по-добър начин, но съм виждал това направено:

Създайте основния документ като низ:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html></html>

След това анализирайте този низ, за ​​да започнете новия си документ.

person Gareth Simpson    schedule 01.07.2009
comment
+1, потвърдено, elementtree не може да добавя/създава doctype (но може да го анализира!), така че това решение е толкова чисто, колкото може. - person Alex Martelli; 01.07.2009
comment
Изглежда, че това вече не работи: import xml.etree.ElementTree as ET; string = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html></html>''';print(ET.tostring(ET.fromstring(string), encoding='unicode')) излъчва само <html /> - person Matteo Gamboz; 07.12.2020

Аз съм имал същия проблем. При синтактичен анализ на документ и записване на документа обратно дефиницията за тип документ вече не присъства. Намерих решение, разглеждайки документацията:

текст на връзката

Запазване на HTML файлове #

За да запазите обикновен HTML файл, просто напишете дървото.

tree.write("outfile.htm")

Това работи добре, стига файлът да не съдържа вградени тагове SCRIPT или STYLE.

Ако искате, можете да добавите DTD препратка към началото на файла:

file = open("outfile.htm", "wb")
file.write(DTD + "\n")
tree.write(file)
file.close()
person Stephan    schedule 01.02.2010
comment
С помощта на Python 3.6 това не работи веднага, но може лесно да бъде коригирано. Човек трябва да отвори файла с "wb" вместо "w" и да използва .encode() в префиксния низ, тъй като file.write очаква двоичен параметър с "wb". - person Zoltan; 15.01.2021