【发布时间】: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 片段。
【问题讨论】:
-
您的代码对我来说很好,在
string和XML_tree = etree.fromstring(string.encode('utf-8'), parser=parser)周围使用三引号
标签: python xml parsing xpath lxml