XML解析器语法错误。

4

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

我在xml.parsers.expat.ExpatError中遇到了“语法错误”。现在我无法弄清楚它如何成为Python模块中的语法错误。

我在SO上看到了另一个类似的关于Wikipedia API的问题,它似乎返回HTML而不是XML。Flickr API返回XML;当没有来自Flickr的响应时(例如flickr.galleries.addPhoto),我也会收到相同的错误。

代码:

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:

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
< p > < em >(代码来自http://code.google.com/p/flickrpy/,根据New BSD许可证)

更新:

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

执行urlopen(url, payload).read()会返回HTML,但在终端中很难阅读:P,但我设法看出了“您未登录”。
奇怪的是,Flickr不应该在这里返回任何内容,或者如果权限有问题,它应该像GET函数一样返回一个99:用户未登录/权限不足错误(我希望这应该是有效的XML)。

我已经登录到Flickr(在浏览器中),程序也已经通过delete权限进行了正确的身份验证(虽然很危险,但我想避免权限问题。)

2个回答

6

SyntaxError 通常意味着 Python 语法错误,但我认为这里 expatbuilder 将其重载为 XML 语法错误。请在其周围添加 try:except 块,并打印出 payload 的内容,以找出其中第一行的问题所在。

我猜测 flickr 以某种原因拒绝了您的请求,并返回了一个纯文本错误消息,在第62列有一个无效的 xml 字符,但它可能是任何问题。在解析之前,您可能需要检查 http 状态码。

此外,这个方法被称为 _dopost,但似乎您实际上正在发送一个 http GET。也许这就是它失败的原因。


我不确定这里到底发生了什么。我只是想添加一些API调用,但在测试时遇到了这个问题。还有另一个名为_doget()的函数,它似乎工作方式略有不同(而且正确:-)。感谢您提供打印“payload”的想法。这是我的第一个错误,所以我还在学习:D - avacariu
阅读Python文档,似乎如果您在urlopen()函数中有一个data参数,则会发送POST请求而不是GET请求。所以这部分看起来没问题(似乎)。 - avacariu
它没有引发SyntaxError,而是引发了ExpatError。 - naught101

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密钥和方法必须在URL中而不是负载中。(或者可能只需要一个在那里,但无论如何,它能够工作:-)


我的猜测是正确的,它给出了一个非 XML 错误,对吗? - poolie
1
并不是真正的错误。API_Key没有在URL中,所以它可能没有意识到这是一个API调用,因此假定它是一个浏览器,并响应一个网页。 - avacariu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接