我的python api包装器类中的字符串错误

时间:2010-10-29 21:35:57

标签: python api wrapper

我正在为几个不同的Web服务编写API包装器。

我有一个有文章网址的方法,我想用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 个答案:

答案 0 :(得分:2)

你应该引发Exception或其子类,而不是字符串。

答案 1 :(得分:2)

所提供的信息实际上对诊断或解决问题并没有多大帮助。您是否考虑过查看服务器的响应?您可以使用Fiddler检查完整的流量日志。

此外,Alchemy提供的SDK似乎不是 - 咳嗽,咳嗽 - 最好的质量。因为它实际上只包含大约600行源代码,所以我会考虑编写一个更短,更健壮/ pythonic /任何SDK。

我现在也可以补充说,即使Alchemy网站上的现场演示失败了,所以也许你的问题与此有关。我真的建议看一下流量。

答案 2 :(得分:0)

您收到错误是因为您的函数GetRequest()将字符串作为异常提升:

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

如果这不是您想要的,您有两种选择:

  1. 您可以将函数return设为字符串或None
  2. 您可以将错误消息传递给Exception的真实子类(如 knutin 所示)
  3. 在任何一种情况下,如果要将该返回值分配给变量,则可以相应地处理它。这是一个例子:

    选项1 假设您决定GetRequest()返回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块来处理错误,并可选择打印错误,在那里停止程序,或继续前进(根据你的问题,我认为你想做什么)。

答案 3 :(得分:0)

这是来自AlchemyAPI的Shaun。我们刚刚发布了一个新版本的python SDK,可以正常引发异常。你可以在这里http://www.alchemyapi.com/tools/获得它。

如果您对SDK有任何其他反馈,请给我留言。感谢您使用我们的NLP服务。