Python 3.4 lxml.etree:需要开始标记,未找到“<”,第 1 行,第 1 列

Posted

技术标签:

【中文标题】Python 3.4 lxml.etree:需要开始标记,未找到“<”,第 1 行,第 1 列【英文标题】:lxml.etree: Start tag expected, '<' not found, line 1, column 1 【发布时间】:2015-12-07 05:41:52 【问题描述】:

朋友们,

充其量是新手,鉴于论坛中提供的内容,我无法弄清楚这一点。最终,我要做的就是获取一些简单的 xml 文件,然后一次性将它们全部转换为 CSV(尽管这段代码一次只用于一个)。在我看来,没有正式的名称空间,但我不确定。 我有这段代码(我使用了一个标题“SubmittingSystemVendor”,但我真的很想将它们全部写入 CSV:

import csv
import lxml.etree
x = r'C:\Users\...\jh944.xml'

with open('output.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow('SubmittingSystemVendor')
    root = lxml.etree.fromstring(x)

    writer.writerow(row)

以下是 XML 文件的示例:

<?xml version="1.0" encoding="utf-8"?>
<EOYGeneralCollectionGroup SchemaVersionMajor="2014-2015" SchemaVersionMinor="1" CollectionId="157" SubmittingSystemName="MISTAR" SubmittingSystemVendor="WayneRESA" SubmittingSystemVersion="2014" xsi:noNamespaceSchemaLocation="http://cepi.state.mi.us/msdsxml/EOYGeneralCollection2014-20151.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <EOYGeneralCollection>
        <SubmittingEntity>
            <SubmittingEntityTypeCode>D</SubmittingEntityTypeCode>
            <SubmittingEntityCode>82730</SubmittingEntityCode>
        </SubmittingEntity>

提前致谢!

【问题讨论】:

【参考方案1】:

您正在使用lxml.etree.fromstring,但给它一个文件路径作为参数。这意味着它试图将“C:\Users...\jh944.xml”解释为要解析的 XML 数据。

相反,您想打开包含此 XML 的文件。您可以简单地将对fromstring 的调用替换为lxml.etree.parse,它将接受文件名或打开文件对象作为参数。

【讨论】:

如果我想继续将已解析的 XML 文件写入 CSV,您能提供帮助吗?我在这里创建了一个新问题:***.com/questions/32514049/… 您将需要遍历节点,然后获取每个子元素的文本值,并将其传递给 CSVWriter。 (例如,for node in root.findall("EOYGeneralCollection/SubmittingEntity"): writer.writerow([subnode.text for subnode in node]) 对于非常简单的情况可能就足够了。

以上是关于Python 3.4 lxml.etree:需要开始标记,未找到“<”,第 1 行,第 1 列的主要内容,如果未能解决你的问题,请参考以下文章

将 lxml.etree 导入 python 时出错

Unicode 字符串的 lxml.etree.XML ValueError

来自雅虎的python lxml etree小程序信息

CentOS 6.3 上的 Python lxml etree

python-docx-lxml.etree.XMLSyntaxError:AttValue长度太长

lxml etree xmlparser 删除不需要的命名空间