在python中使用lxml创建元素时出现“无效的标记名称”错误

时间:2013-11-30 16:21:21

标签: 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','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'的编码
  1. str(dt)
  2. unicode(dt).encode('unicode_escape')
  3. dt.encocde('ascii','ignore')
  4. dt.encode('ascii','decode')
  5. 还有其他一些,但没有工作,并且生成了相同的错误消息。

2 个答案:

答案 0 :(得分:4)

您收到错误,因为不允许元素名称以XML中的数字开头。请参阅http://www.w3.org/TR/xml/#sec-common-synhttp://www.w3.org/TR/xml/#sec-starttags。名称的第一个字符必须是NameStartChar,不允许使用数字。

<2013-11-30>...</2013-11-30>等元素无效。

<D2013-11-30>...</D2013-11-30>等元素可以。

如果您的程序更改为使用ElementTree而不是lxml(from xml.etree import ElementTree as etree而不是from lxml import etree),则没有错误。但我会认为这是一个错误。 lxml是正确的,ElementTree没有。

答案 1 :(得分:0)

它不是关于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))