Ошибка с AlchemyAPI Python SDK - PullRequest
       22

Ошибка с AlchemyAPI Python SDK

0 голосов
/ 15 октября 2011

Я пытаюсь использовать AlchemyAPI Python 0.7 SDK.Однако, когда я запускаю метод внутри него, например URLGetText (url);

, я получаю эту ошибку:

    nodes = etree.fromstring(result).xpath(xpathQuery)
  File "lxml.etree.pyx", line 2743, in lxml.etree.fromstring (src/lxml/lxml.etree.c:52665)
  File "parser.pxi", line 1573, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:79932)
  File "parser.pxi", line 1452, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:78774)
  File "parser.pxi", line 960, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:75389)
  File "parser.pxi", line 564, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:71739)
  File "parser.pxi", line 645, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:72614)
  File "parser.pxi", line 585, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:71955)
lxml.etree.XMLSyntaxError: AttValue: " or ' expected, line 19, column 11

Это происходит из этой области кода:

  def GetRequest(self, apiCall, apiPrefix, paramObject):
    endpoint = 'http://' + self._hostPrefix + '.alchemyapi.com/calls/' + apiPrefix + '/' + apiCall
    endpoint += '?apikey=' + self._apiKey + paramObject.getParameterString()
    handle = urllib.urlopen(endpoint)
    result = handle.read()
    handle.close()
    xpathQuery = '/results/status'
    nodes = etree.fromstring(result).xpath(xpathQuery)
    if nodes[0].text != "OK":
      raise Exception, 'Error making API call.'
    return result

У кого-нибудь есть идеи о том, что идет не так?

Спасибо

Даниэль Кершоу

1 Ответ

0 голосов
/ 15 октября 2011

Я посмотрел документы Python urllib и нашел эту страницу:

http://docs.python.org/library/urllib.html#high-level-interface

, который содержит это предупреждение об объекте filehandle, возвращаемом urllib.urlopen():

Одно предостережение: метод read (), если аргумент size пропущен или отрицателен, может не считываться до конца потока данных; нет хорошего способа определить, что весь поток из сокета был прочитан в общем случае.

Я думаю, что, возможно, вам следует убедиться, что вы получили все содержимое файла в виде строки Python, прежде чем анализировать его с помощью etree.fromstring() API. Что-то вроде:

result = ''
while (1):
    next = handle.read()
    if not next: 
        break
    result += next
...