&引用;无效的标记名";在python中使用lxml创建元素时出错

&引用;无效的标记名";在python中使用lxml创建元素时出错,python,xml,python-2.7,lxml,Python,Xml,Python 2.7,Lxml,我正在使用lxml创建一个xml文件,我的示例程序是: from lxml import etree import datetime dt=datetime.datetime(2013,11,30,4,5,6) dt=dt.strftime('%Y-%m-%d') page=etree.Element('html') doc=etree.ElementTree(page) dateElm=etree.SubElement(page,dt) outfile=open('somefile.xml',

我正在使用lxml创建一个xml文件,我的示例程序是:

from lxml import etree
import datetime
dt=datetime.datetime(2013,11,30,4,5,6)
dt=dt.strftime('%Y-%m-%d')
page=etree.Element('html')
doc=etree.ElementTree(page)
dateElm=etree.SubElement(page,dt)
outfile=open('somefile.xml','w')
doc.write(outfile)
我得到以下错误输出:

dateElm=etree.SubElement(page,dt)
  File "lxml.etree.pyx", line 2899, in lxml.etree.SubElement (src/lxml/lxml.etree.c:62284)
  File "apihelpers.pxi", line 171, in lxml.etree._makeSubElement (src/lxml/lxml.etree.c:14296)
  File "apihelpers.pxi", line 1523, in lxml.etree._tagValidOrRaise (src/lxml/lxml.etree.c:26852)
ValueError: Invalid tag name u'2013-11-30'
我认为这是一个Unicode错误, 因此,尝试用如下代码更改“dt”的编码

  • str(dt)
  • unicode(dt).encode('unicode_escape')
  • dt.encocde('ascii','ignore')
  • dt.encode('ascii','decode')

  • 还有其他一些,但没有一个起作用,并且生成了相同的错误消息。

    您会收到错误,因为元素名称在XML中不允许以数字开头。见和。名称的第一个字符必须是
    NameStartChar
    ,这不允许使用数字

    诸如
    之类的元素无效

    诸如
    之类的元素正常


    如果您的程序更改为使用ElementTree而不是lxml(
    从xml.etree导入ElementTree作为etree
    而不是从lxml导入etree),则没有错误。但我会认为这是一个错误。lxml做了正确的事情,ElementTree没有。

    它与Unicode无关。HTML中没有
    2013-11-30
    标记。您可以使用
    time
    标记:

    #!/usr/bin/env python
    from datetime import date
    from lxml.html import tostring
    from lxml.html.builder import E
    
    
    datestr = date(2013, 11, 30).strftime('%Y-%m-%d')
    
    page = E.html(
        E.title("date demo"),
        E('time', "some value", datetime=datestr))
    
    with open('somefile.html', 'wb') as file:
        file.write(tostring(page, doctype='<!doctype html>', pretty_print=True))
    
    #/usr/bin/env python
    起始日期时间导入日期
    从lxml.html导入到字符串
    从lxml.html.builder导入E
    datestr=date(2013,11,30).strftime(“%Y-%m-%d”)
    page=E.html(
    E.标题(“日期演示”),
    E('time','some value',datetime=datestr))
    以open('somefile.html','wb')作为文件:
    write(tostring(page,doctype='',pretty\u print=True))
    
    能否添加输入XMl的相关片段?^我的XMl文件为空。我正在使用最后一行代码“doc.write(outfile)”编写输出,似乎您正在将日期作为标记写入。这就是你想做的吗?^A……是的。我写得像个值我在插入日期之前使用str(date)方法将日期元素更改为字符串..我用'xml.etree.ElementTree'尝试了同样的方法,效果很好。“lxml”可能有问题,但我不确定。如果我错了,请纠正我。使用
    str(dt)
    没有帮助。在程序中的这一点上,
    dt
    已经是一个字符串(返回值为
    datetime.strftime()
    )。lxml拒绝
    2013-11-30
    标记名时是正确的。@j.f.sebastian-这肯定是'xml.etree.ElementTree'上的错误,因为即使它将'date'格式保存到'xml'文件,如果我对保存的文件执行'xml.etree.ElementTree.parse('somefile.xml'),它也会显示解析错误。在“date”标记中添加一个额外的字符可以解决这个问题。谢谢你的帮助!!我的文件是“xml”,而不是“html”。所以,我可以将任何东西存储为标记,因为它是str(如果错误,请更正我)。如果我导入'xml.etree.ElementTree',我的代码运行良好,我不知道为什么在'lxml'@Chandrakant:1中会出现问题。如果文档实际上不是html,则不要使用root
    html
    标记。这是误导。2.因为,
    ElementTree
    接受您的输入是错误的
    lxml
    按照XML规范中的定义工作。正如您所说,您的文件是“xml”,因此它必须遵循xml规范。