【问题标题】:python parse XML with lxml giving the right parser parameterspython使用lxml解析XML,给出正确的解析器参数
【发布时间】:2021-03-23 10:21:49
【问题描述】:

我在python中用lxml解析xml数据

数据如下:

string='''<?xml version="1.0" encoding="UTF-8"?>/n
    <div type="request" xml:base="/k-api/7728" xml:lang="en" >
    <div n="" type="request" xml:id="_54f59d0003">
        <p xml:id="_54f59d0004"/>
        <p xml:id="_54f59d0005">Requests </p>
    </div>
    <div n="0001" type="request" xml:id="_54f59d0006">
        <p xml:id="_54f59d0007">1.  First request.
        </p>
    </div>
    <div n="0002" type="claim" xml:id="_54f59d0008">
         <p xml:id="_54f59d0009">2. Second request.
         </p>
    </div>
    <div n="0003" type="request" xml:id="_54f59d0010">
         <p xml:id="_54f59d0011">3. Thrid requests.
         </p>
    </div>
    <div n="0004" type="request" xml:id="_54f59d0012">
        <p xml:id="_54f59d0013">4. request.
        </p>
    </div>
</div>'''


import xml.etree.ElementTree as ET
from lxml import etree
parser = etree.XMLParser(encoding="UTF-8", resolve_entities=False, strip_cdata=False, recover=True, ns_clean=True)
XML_tree = etree.fromstring(xml_string,parser=parser)

这不起作用,因为有几个原因 a) 换行符\n:我可以解决这个问题

xml_string = ''.join(string.splitlines())

但我想知道是否有办法在解析器中告诉 lxml 不应该处理换行符 b) Utf-8 字符串中的第一行。我也可以通过以下方式处理它:

xml_string = xml_string.replace('<?xml version="1.0" encoding="UTF-8"?>','')

在解析之前,但有没有办法在 lxml 解析器中完成所有操作?即告诉解析器删除换行符并忘记编码(注意: encoding="UTF-8" 或 encoding=None 将不能解决问题)

谢谢

编辑 1:我在不删除编码位时得到的错误是: ValueError:不支持带有编码声明的 Unicode 字符串。请使用不带声明的字节输入或 XML 片段。

【问题讨论】:

标签: python xml parsing xpath lxml


【解决方案1】:

如果 XML 片段包含 XML 声明,则 etree.fromstring() 函数应该将 XML 字符串输入编码为字节以正确解析。

或者,可以使用ElementTree.fromstring()函数。

import xml.etree.ElementTree as ET
from lxml import etree

xml_string = '''<?xml version="1.0" encoding="UTF-8"?>
<div...>
</div>'''

parser = etree.XMLParser(encoding="UTF-8", resolve_entities=False, strip_cdata=False, recover=True, ns_clean=True)

# Option 1
root = etree.fromstring(xml_string.encode('utf-8'), parser)

# Option 2
root = ET.fromstring(xml_string, parser)

# do something with the parsed XML

pretty_xml = etree.tostring(root, pretty_print=True, encoding=str)
print(pretty_xml)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多