【问题标题】:"Invalid tag name" error when creating element with lxml in python在 python 中使用 lxml 创建元素时出现“无效的标签名称”错误
【发布时间】:2013-11-30 16:21:21
【问题描述】:

我正在使用 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')

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

【问题讨论】:

  • 你能添加你输入XMl的相关片段吗?
  • ^ 我的 xml 文件为空。我正在使用最后一行代码编写输出 - 'doc.write(outfile)'
  • 您似乎正在将日期写为标签。这就是你的意思吗?
  • ^ 啊..是的。我在写 some value

标签: python xml python-2.7 lxml


【解决方案1】:

您收到错误是因为元素名称在 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 没有。

【讨论】:

  • 我在插入日期元素之前使用 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')" 用于保存的文件。在“日期”标签中添加一个额外的字符可以解决问题。感谢您的帮助!
【解决方案2】:

这与 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))

【讨论】:

  • 我的文件是 'xml' ,而不是 'html'。所以,我可以将任何东西存储为标签,因为它是 str (如果错了,请纠正我..)。如果我导入 'xml.etree.ElementTree' ,我的代码工作正常,我不知道为什么它在 'lxml' 中有问题
  • @Chandrakant: 1. 如果文档实际上不是 HTML,请不要使用根 html 标签。这是误导。 2. 作为mzjn saidElementTree 接受你的输入是错误的。 lxml 按照 XML 规范中的定义工作。正如您所说,您的文件是“xml”,因此它必须遵循 XML 规范。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
相关资源
最近更新 更多