XML解析器语法错误

4 投票
2 回答
9424 浏览
提问于 2025-04-16 03:50

我正在处理一段与Flickr API通信的代码。

我遇到了一个“语法错误”,具体是在xml.parsers.expat.ExpatError中(见下文)。我搞不懂为什么在Python模块中会出现语法错误。

我在StackOverflow上看到过一个类似的问题,关于维基百科API,它似乎返回的是HTML而不是XML。而Flickr API返回的是XML;而且在某些情况下(比如flickr.galleries.addPhoto),我也遇到了同样的错误,按理说Flickr不应该有任何响应。

代码:

def _dopost(method, auth=False, **params):
    #uncomment to check you aren't killing the flickr server
    #print "***** do post %s" % method

    params = _prepare_params(params)
    url = '%s%s/%s' % (HOST, API, _get_auth_url_suffix(method, auth, params))
    payload = 'api_key=%s&method=%s&%s'% \
          (API_KEY, method, urlencode(params))

    #another useful debug print statement
    #print url
    #print payload

    return _get_data(minidom.parse(urlopen(url, payload)))

错误追踪:

Traceback (most recent call last):
  File "TESTING.py", line 30, in <module>
    flickr.galleries_create('test_title', 'test_descriptionn goes here.')
  File "/home/vlad/Documents/Computers/Programming/LEARNING/curatr/flickr.py", line 1006, in galleries_create
    primary_photo_id=primary_photo_id)
  File "/home/vlad/Documents/Computers/Programming/LEARNING/curatr/flickr.py", line 1066, in _dopost
    return _get_data(minidom.parse(urlopen(url, payload)))
  File "/usr/lib/python2.6/xml/dom/minidom.py", line 1918, in parse
    return expatbuilder.parse(file)
  File "/usr/lib/python2.6/xml/dom/expatbuilder.py", line 928, in parse
    result = builder.parseFile(file)
  File "/usr/lib/python2.6/xml/dom/expatbuilder.py", line 207, in parseFile
    parser.Parse(buffer, 0)
xml.parsers.expat.ExpatError: syntax error: line 1, column 62

(代码来自 http://code.google.com/p/flickrpy/,遵循新BSD许可证)

更新:

print urlopen(url, payload) 的结果是 <addinfourl at 43340936 whose fp = <socket._fileobject object at 0x29400d0>>

执行 urlopen(url, payload).read() 返回的是HTML,这在终端中很难阅读 :P 但我勉强看出了一句“您尚未登录。”
奇怪的是,Flickr在这里不应该返回任何东西,或者如果权限有问题,它应该返回一个 99: 用户未登录 / 权限不足 的错误,就像GET函数那样(我本来期待返回的是有效的XML)。

我已经在浏览器中登录了Flickr,并且程序也获得了delete权限(虽然有点危险,但我想避免权限问题)。

2 个回答

6

SyntaxError 通常表示 Python 代码的语法错误,但在这里我觉得 expatbuilder 是在把它用来表示 XML 语法错误。你可以在代码周围加一个 try:except 块,然后打印出 payload 的内容,看看它的第一行有什么问题。

我猜可能是 flickr 拒绝了你的请求,给你返回了一个普通的错误信息,这个信息在第62个字符的位置有一个无效的 XML 字符,但也可能有其他原因。你可能需要在解析之前先检查一下 HTTP 状态码。

另外,这个方法叫 _dopost 但你似乎实际上是在发送一个 HTTP GET 请求,这可能就是它失败的原因。

2

这似乎解决了我的问题:

url = '%s%s/?api_key=%s&method=%s&%s'% \
      (HOST, API, API_KEY, method, _get_auth_url_suffix(method, auth, params))
payload = '%s' % (urlencode(params))

看起来API密钥和方法需要放在网址里,而不是放在数据包里。(或者可能只需要放一个,但无论如何,现在可以用了 :-)

撰写回答