lxml.etree:需要开始标记,'<' not found, line 1, column 1

问题描述 投票:0回答:2

我想获取一些简单的 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>

错误是:

lxml.etree:需要开始标记,'<' not found, line 1, column 1

python xml lxml
2个回答
17
投票

您正在使用

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

相反,您想要打开包含此 XML 的文件。您可以简单地将对

fromstring
的调用替换为
lxml.etree.parse
,它将接受文件名或打开的文件对象作为参数。


0
投票

我也遇到了同样的问题,我花了几个小时试图解决它,最终我发现文件的编码是带有BOM的UTF-8,我使用UTF-8保存文件,问题就解决了。

© www.soinside.com 2019 - 2024. All rights reserved.