2016-04-02 4 views
0

Python用のWolfram | Alpha APIが新しく、インターネット上で多くのヘルプが見つからないため、スタックオーバーフローが発生しました。 Wolfram | Alphaのいくつかのクエリで「NameError:name 'pod'が定義されていません」というメッセージが表示されます。どんな助けでも大歓迎です。私がクエリ "Length of a Ferrari 458"を入力したとき、私はStopIterationエラーで終わっていましたが、今では "pods"メソッドを使うようにコードを変更しました。今度はNameErrorを取得します。外出は私に車の長さを与えるべきである(https://www.wolframalpha.com/input/?i=length+of+ferrari+458)私はそれが私のものではないので、私はapp_idをxにしなければならなかった、不都大変申し訳ありません。Wolfram | Alpha API Python NameError:名前 'pod'が定義されていません

#!/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 
+1

を 'res.results'発電機は空です。私はAPIに精通していません、おそらく 'res.pods'は同じジェネレータを共有していますか? –

+0

質問を更新して、代わりにあなたが*期待した*を追加してください。 –

+0

[documentation](https://pypi.python.org/pypi/wolframalpha)は、* one *または* other *を使用する必要があることを示しています。 –

答えて

0

シーケンスがnextで例外が発生した空の場合。

第2パラメータとしてNoneを渡し、デフォルトとして戻します。

next(iterator[, default])
Retrieve the next item from the iterator by calling its next() method. If default is given, it is returned if the iterator is exhausted, otherwise StopIteration is raised.

そこには結果がありません、あなたは例外を処理しない場合:リンクdocumentationから

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

結果がない場合は、firstはあなたができるNone、となりますそれを使用しようとする前に確認してください。あなたが二回クエリを作成せずに、二回発電機を使用する場合は、使用するため

+0

さて、 'next()'はデフォルトを返すことができますが、結果がないという問題を解決するのには役立ちません。そして、 '.text'に属性エラーが発生します。 –

+0

この問題は空の 'results'属性の問題ではなく、' StopIteration'の問題として提起されています。 –

+0

明らかにエラーが発生することなく照会できるようにしたいと考えています。たとえば、「Ferrari 458のトップスピード」と入力し、StopIterationを使用して戻したいとします。私が新しくなったので、デフォルトとして返すための2番目のパラメータとして、noneを渡すことでは分かりません。 –

0

、あなたは発電機の2つのコピーを持っている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) 
... 
... 
0

source codeは示し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> 

Webインターフェイスを抽出するために管理して2015 Ferrari 458 Italia | overall lengthクエリにそこから取得できますかAPIドキュメントから明らかではありません。

あなたは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 
+0

ありがとうMartijin、役に立つが、それでも私のクエリへの答えを私に与えていない。 Wolfram APIを使って答えられる可能性はありますか? –

+0

私は方法を見つけませんでした。 APIのドキュメントにはヒントもありません。 –