Помещение ответа XML-сервера pyCurl в переменную (Python) - PullRequest
3 голосов
/ 02 ноября 2008

Я новичок в Python, пытаюсь использовать pyCurl. Проект, над которым я работаю, - это создание оболочки Python для API twitpic.com (http://twitpic.com/api.do).. В справочных целях проверьте код (http://pastebin.com/f4c498b6e) и полученную ошибку (). http://pastebin.com/mff11d31).

Обратите особое внимание на строку 27 кода, которая содержит «xml = server.perform ()». Изучив мою проблему, я обнаружил, что, в отличие от того, что я думал ранее, .perform () не возвращает xml-ответ от twitpic.com, но None, когда загрузка завершается (дух!).

Посмотрев далее на вывод ошибок, мне кажется, что ввод xml, который я хочу вставить в переменную "xml", вместо этого печатается в стандартный вывод или стандартную ошибку эфира (не уверен, какая именно). Я уверен, что есть простой способ сделать это, но я не могу думать об этом в данный момент. Если у вас есть какие-либо советы, которые могли бы указать мне правильное направление, я был бы очень признателен. Заранее спасибо.

Ответы [ 2 ]

12 голосов
/ 28 февраля 2010

Использование StringIO было бы намного чище, нет смысла использовать такой фиктивный класс, если все, что вам нужно, это данные ответа ...

Что-то вроде этого будет достаточно:

import pycurl
import cStringIO

response = cStringIO.StringIO()

c = pycurl.Curl()
c.setopt(c.URL, 'http://www.turnkeylinux.org')
c.setopt(c.WRITEFUNCTION, response.write)
c.perform()
c.close()

print response.getvalue()
4 голосов
/ 02 ноября 2008

Pycurl Doc прямо говорит:

execute () -> Нет

Итак, ожидаемый результат - это то, что вы наблюдаете.

глядя на пример с сайта pycurl:

import sys
import pycurl

class Test:
   def __init__(self):
       self.contents = ''

   def body_callback(self, buf):
       self.contents = self.contents + buf

print >>sys.stderr, 'Testing', pycurl.version

t = Test()
c = pycurl.Curl()
c.setopt(c.URL, 'http://curl.haxx.se/dev/')
c.setopt(c.WRITEFUNCTION, t.body_callback)
c.perform()
c.close()

print t.contents

Интерфейсу требуется экземпляр класса - Test() - с определенным обратным вызовом для сохранения содержимого. Обратите внимание на вызов c.setopt(c.WRITEFUNCTION, t.body_callback) - что-то подобное отсутствует в вашем коде, поэтому вы не получаете никаких данных (buf в примере). Пример показывает, как получить доступ к контенту:

print t.contents
...