沃尔夫拉姆|Alpha API Python 名称错误:未定义名称"pod"



我是Wolfram|Alpha API python的新手,在互联网上找不到太多帮助,所以我转向堆栈溢出。在Wolfram|Alpha上的一些查询中,我收到了"NameError:name‘pod’is not defined"。任何帮助都将不胜感激。当我输入我的查询"法拉利458的长度"时,我过去常常会出现StopIteration错误,现在我已经将代码更改为使用"pods"方法。现在我收到一个NameError。输出应该能告诉我汽车的长度(https://www.wolframalpha.com/input/?i=length+of+ferrari+458)我不得不把app_id换成x,因为它不是我的,很抱歉给你带来不便。

#!/usr/bin/python
import wolframalpha
app_id=('xxxxxx-xxxxxxxxxx')
client = wolframalpha.Client(app_id)
query = input("Query:")
if len(res.pods) > 0:
texts = ""
pod = res.pods[1]
if pod.text:
  texts = pod.text
else:
  texts = "I have no answer for that"
texts = texts.encode('ascii', 'ignore')
print (texts)

我得到的错误:

 Query: length of ferrari 458
   Traceback (most recent call last):
     File "Wolfram.py", line 24, in <module>
       if pod.text:
  NameError: name 'pod' is not defined

如果您计划使用生成器两次,而不进行两次查询,则可以使用itertools.tee获得生成器的两个副本供您使用:

from itertools import tee
res1, res2 = tee(res, 2)
# consume the first generator:
for pod in res1:
    ...
    ...
# you have a second generator you can use:
print(next(res2.results).text)
...
...
源代码显示res.podsres.results共享相同的迭代器。您得到的错误只是意味着没有结果。请尝试其他查询。

示例查询有效,例如:

>>> res = client.query('temperature in Washington, DC on October 3, 2012')
>>> print(next(res.results).text)
(21 to 27) °C (average: 24 °C)
(Wednesday, October 3, 2012)
>>> [p.title for p in res]
['Input interpretation', 'Result', 'History', 'Weather station information']

您的特定查询没有返回任何结果,显然是因为有一些假设需要确认;访问http://api.wolframalpha.com/v2/query?input=length+of+a+Ferrari+458&appid=<your-app-id>生成:

<?xml version='1.0' encoding='UTF-8'?>
<queryresult success='false'
    error='false'
    numpods='0'
    datatypes=''
    timedout=''
    timedoutpods=''
    timing='2.742'
    parsetiming='0.79'
    parsetimedout='false'
    recalculate=''
    id='MSPa12051ddfeh1dgh883d2e000035eh08fba72b042e'
    host='http://www4f.wolframalpha.com'
    server='9'
    related=''
    version='2.6'
    profile='EnterDoQuery:0.,StartWrap:2.74235'>
 <didyoumeans count='2'>
  <didyoumean score='0.365929' level='medium'>Ferrari 458</didyoumean>
  <didyoumean score='0.26087' level='low'>length</didyoumean>
 </didyoumeans>
</queryresult>

API文档中不清楚如何从那里获取web界面设法提取的2015 Ferrari 458 Italia | overall length查询。

可以使用ElementTree API:通过Result.tree属性访问didyoumean元素

>>> res = client.query('length of a Ferrari 458')
>>> for didyoumean in res.tree.findall('//didyoumean'):
...     print didyoumean.text
...
Ferrari 458
length

如果序列为空next将引发异常。

None作为第二个参数传递,作为默认值返回。来自链接文档:

next(iterator[, default])
通过调用迭代器next()方法,从该迭代器中检索下一个项。如果给定了默认,则在迭代器耗尽时返回该值,否则将引发StopIteration

如果没有结果,并且您不想处理异常:

first = next(res.results, None)
if first:
    print(first.text)

如果没有结果,first将是None,然后您可以在尝试使用它之前检查它。

相关内容

  • 没有找到相关文章

最新更新