所以我正在处理一个与Flickr API通信的代码块。
我在xml.parsers.expat.ExpatError
(下面)中收到'语法错误'。现在我无法弄清楚它是如何在Python模块中出现语法错误的。
我在SO上看到了关于维基百科API的另一个类似问题,它似乎返回了HTML的XML内容。 Flickr API返回XML;当Flickr没有响应时,我也会收到同样的错误(例如flickr.galleries.addPhoto
)
CODE:
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
(新BSD许可下的http://code.google.com/p/flickrpy/代码)
更新:
print urlopen(url, payload)
== <addinfourl at 43340936 whose fp = <socket._fileobject object at 0x29400d0>>
执行urlopen(url, payload).read()
会返回难以在终端中阅读的HTML:P但我设法找到了“您尚未登录。”
奇怪的是,Flickr不应该在这里返回任何内容,或者如果权限是一个问题,它应该返回一个99: User not logged in / Insufficient permissions
错误,就像它对GET函数一样(我希望它是有效的XML)。
我已登录Flickr(在浏览器中)并且该程序已通过delete
权限进行了正确身份验证(危险,但我希望避免权限问题。)
答案 0 :(得分:6)
SyntaxError
通常意味着Python语法中的错误,但我认为expatbuilder在重载它意味着XML语法错误。在它周围放一个try:except
块,打印出payload
的内容,找出它的第一行有什么问题。
我的猜测是,flickr因某种原因拒绝了您的请求并返回了纯文本错误消息,该消息在第62列有一个无效的xml字符,但它可能是任意数量的东西。您可能希望在解析之前检查http状态代码。
此外,这个方法被称为_dopost
有点奇怪,但您似乎实际上是在发送http GET
。也许这就是它失败的原因。
答案 1 :(得分: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中,而不是在有效负载中。 (或者可能只有一个需要在那里,但无论如何,它的工作原理: - )