解析XML时发生xml.parsers.expat.ExpatError

8 投票
4 回答
37246 浏览
提问于 2025-04-15 12:57

我正在尝试用Python解析XML,但进展不太顺利。我觉得可能是因为这个API返回的XML结构不对。

这是GET请求返回的内容:

<codigo>3</codigo><valor></valor><operador>Dummy</operador>

GET请求的内容在这里:

http://69.36.9.147:8090/clientes/SMS_API_OUT.jsp?codigo=ABCDEFGH&cliente=XX

这是我使用的Python代码,但没有成功:

import urllib
from xml.dom import minidom

url = urllib.urlopen('http://69.36.9.147:8090/clientes/SMS_API_OUT.jsp?codigo=ABCDEFGH&cliente=XX')
xml = minidom.parse(url)
code = doc.getElementsByTagName('codigo')

print code[0].data

这是我收到的响应:

xml.parsers.expat.ExpatError: junk after document element: line 1, column 18

我需要做的是提取<codigo>元素里面的值,并把它放到一个变量里(其他元素也是一样)。

4 个回答

1
import urllib.request
from xml.etree import ElementTree

with urllib.request.urlopen("<your URL>") as url:
    xmldata = '<root>' + str(url.read()) + '</root>'
    tree = ElementTree.fromstring(xmldata)
    codigo = tree.find('codigo').text

想要了解更多,可以看看这个答案的原始Python 2版本:
https://stackoverflow.com/a/1140753/2745495

4

一个XML文档由一个最顶层的文档元素组成,下面可以有多个子元素。你的XML片段里有多个顶层元素,这在XML标准中是不允许的。

你可以试着返回类似这样的内容:

<result><codigo>3</codigo><valor></valor><operador>Dummy</operador></result>

我把整个响应包裹在一个<result>标签里。

13

这里的主要问题是,那个服务返回的XML代码没有根节点,这样是不合法的。我通过简单地把输出包裹在一个<root>节点里来解决这个问题。

import urllib
from xml.etree import ElementTree

url = 'http://69.36.9.147:8090/clientes/SMS_API_OUT.jsp?codigo=ABCDEFGH&cliente=XX'
xmldata = '<root>' + urllib.urlopen(url).read() + '</root>'
tree = ElementTree.fromstring(xmldata)
codigo = tree.find('codigo').text

print codigo

你可以使用任何你喜欢的解析器,但在这里我用了ElementTree来获取值。

撰写回答