Синтаксическая ошибка синтаксического анализатора XML - PullRequest
4 голосов
/ 08 сентября 2010

Итак, я работаю с блоком кода, который связывается с Flickr API.

Я получаю «синтаксическую ошибку» в xml.parsers.expat.ExpatError (ниже).Теперь я не могу понять, как это будет синтаксическая ошибка в модуле Python.

Я видел еще один похожий вопрос на SO, касающийся API Википедии, который, похоже, возвращал HTML intead 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

(код от 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: User not logged in / Insufficient permissions, как это происходит с функцией GET (что, как я ожидал, будет действительнымXML).

Я вошел в Flickr (в браузере), и программа должным образом аутентифицирована с разрешениями delete (опасно, но я хотел избежать проблем с разрешениями.)

Ответы [ 2 ]

6 голосов
/ 08 сентября 2010

SyntaxError обычно означает ошибку в синтаксисе Python, но я думаю, что здесь expatbuilder перегружает его, что означает ошибку синтаксиса XML.Поместите вокруг него блок try:except и распечатайте содержимое payload и выясните, что не так с первой строкой.

Я думаю, что flickr по какой-то причине отклоняет ваш запрос и возвращает сообщение об ошибке в виде простого текста, в столбце 62 которого указан недопустимый символ xml, но это может быть любое количество вещей.Возможно, вы захотите проверить код состояния http перед его анализом.

Кроме того, немного странно, что этот метод называется _dopost, но вы, похоже, действительно отправляете http GET.Возможно, именно поэтому он терпит неудачу.

2 голосов
/ 08 сентября 2010

Это, кажется, решает мою проблему:

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, а не в полезной нагрузке.(Или, может быть, только один должен был быть там, но в любом случае, это работает: -)

...