Строковая ошибка в моем классе оболочки Python API - PullRequest
1 голос
/ 30 октября 2010

Я пишу обертку API для нескольких различных веб-сервисов.

У меня есть метод с URL-адресом статьи, и я хочу извлечь из него текст, используя alchemyapi.

def extractText(self):
    #All Extract Text Methods ---------------------------------------------------------//
    #Extract page text from a web URL (ignoring navigation links, ads, etc.).
    if self.alchemyapi == True:
        self.full_text = self.alchemyObj.URLGetText(self.article_link)

, который идет к следующему коду в оболочке Python

def URLGetText(self, url, textParams=None):
    self.CheckURL(url)
    if textParams == None:
      textParams = AlchemyAPI_TextParams()
    textParams.setUrl(url)
    return self.GetRequest("URLGetText", "url", textParams)

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 'Error making API call.'
    return result

Однако я получаю эту ошибку ---

  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "text_proc.py", line 97, in __init__
    self.alchemyObj.loadAPIKey("api_key.txt");    
  File "text_proc.py", line 115, in extractText
    if self.alchemyapi == True:
  File "/Users/Diesel/Desktop/AlchemyAPI.py", line 502, in URLGetText
    return self.GetRequest("URLGetText", "url", textParams)
  File "/Users/Diesel/Desktop/AlchemyAPI.py", line 618, in GetRequest
    raise 'Error making API call.'

Я знаю, что каким-то образом передаю строку URL-адреса обертке API в неправильном формате, но я не могу понять, как это исправить.

Ответы [ 4 ]

2 голосов
/ 30 октября 2010

Предоставленная информация на самом деле не очень полезна для диагностики или решения проблемы.Рассматривали ли вы взглянуть на ответ от сервера?Вы можете проверить полный журнал трафика, используя Fiddler .

Кроме того, SDK, предоставленный Alchemy, кажется не самого лучшего качества - кашель, кашель.Поскольку он действительно содержит всего около 600 строк исходного кода, я хотел бы написать более короткий, более надежный / pythonic / любой другой SDK.

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

2 голосов
/ 30 октября 2010

Вы должны поднять Exception или его подкласс вместо строки.

0 голосов
/ 03 ноября 2010

Это Шон из AlchemyAPI.Мы только что опубликовали новую версию Python SDK, которая правильно генерирует исключения.Вы можете получить его здесь http://www.alchemyapi.com/tools/.

Если у вас есть другие отзывы о SDK, пожалуйста, напишите мне.Спасибо за использование нашего сервиса НЛП.

0 голосов
/ 30 октября 2010

Вы получаете ошибку, потому что ваша функция GetRequest() вызывает строку как исключение:

if nodes[0].text != "OK":
  raise 'Error making API call.'

Если это не то, что вы хотите, у вас есть два варианта:

  1. Вы можете иметь функцию return строку или None, или
  2. Вы можете передать сообщение об ошибке реальному подклассу Exception (как предложено knutin )

В любом случае, если вы присваиваете это возвращаемое значение переменной, вы можете обработать его соответствующим образом. Вот пример:

Вариант 1 Предположим, вы решили получить GetRequest() return None:

def URLGetText(self, url, textParams=None):
    self.CheckURL(url)
    if textParams == None:
        textParams = AlchemyAPI_TextParams()
    textParams.setUrl(url)

    # Capture the value of GetRequest() before returning it
    retval = self.GetRequest("URLGetText", "url", textParams)
    if retval is None:
        print 'Error making API call.' # print the error but still return 

    return retval 

def GetRequest(self, apiCall, apiPrefix, paramObject):
    # ...
    if nodes[0].text != "OK":
      return None
    return result

Эта опция немного двусмысленна. Откуда вы знаете, что это действительно ошибка или возвращаемое значение действительно было None?

Вариант 2 Это, вероятно, лучший способ сделать это:

Сначала создайте подкласс Exception:

class GetRequestError(Exception):
    """Error returned from GetRequest()"""
    pass

Затем поднимите его в GetRequest () `:

def URLGetText(self, url, textParams=None):
    self.CheckURL(url)
    if textParams == None:
      textParams = AlchemyAPI_TextParams()
    textParams.setUrl(url)

    # Attempt to get a legit return value & handle errors
    try:
        retval = self.GetRequest(apiCall, apiPrefix, paramObject)
    except GetRequestError as err:
        print err # prints 'Error making API call.'
        # handle the error here
        retval = None

    return retval

def GetRequest(self, apiCall, apiPrefix, paramObject):
    # ...
    if nodes[0].text != "OK":
      raise GetRequestError('Error making API call.')
    return result

Таким образом, вы вызываете допустимую ошибку, когда GetRequest () не возвращает желаемый результат, а затем вы можете обработать ошибку, используя блок try..except, и при желании вывести ошибку, остановить программу или сохранить собирается (это то, что я думаю, что вы хотите сделать на основе вашего вопроса).

...