我正在为几个不同的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包装器,但我无法弄清楚如何修复它。
答案 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.'
如果这不是您想要的,您有两种选择:
return
设为字符串或None
或Exception
的真实子类(如 knutin 所示)在任何一种情况下,如果要将该返回值分配给变量,则可以相应地处理它。这是一个例子:
选项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服务。