XML分析器语法

2024-04-25 08:47:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我在xml.parsers.expat.ExpatError(下面)中收到一个“语法错误”。现在我不知道在Python模块中它是如何出现语法错误的。

我看到了另一个类似的问题,关于Wikipedia API,它似乎返回了HTML-intead-of-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 (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,但我成功地识别出一个“You are not signed in.”
奇怪的是Flickr在这里不应该返回任何内容,或者如果权限是一个问题,它应该返回一个99: User not logged in / Insufficient permissions错误,就像它对GET函数所做的那样(我希望它是有效的XML)。

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


Tags: inpyapiurlparselinexmlparams
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中,而不是在有效负载中。(或者可能只需要一个,但无论如何,它是有效的:-)

SyntaxError通常表示Python语法中的错误,但我认为expatbuilder在这里重载它,表示XML语法错误。在它周围放一个try:except块,打印出payload的内容,并找出第一行有什么问题。

我的猜测是flickr出于某种原因拒绝了您的请求,并返回了一条纯文本错误消息,该消息在第62列中有一个无效的xml字符,但可能有很多种情况。在分析http状态代码之前,您可能需要检查它。

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

相关问题 更多 >