2016-04-29 12 views
1

を実行したときのPythonコマンドラインの挙動は、私は、入力データIは私が供給URLのWebフォームに供給するスクリプトを記述しようとしている動作とは異なります。 要求 - スクリプトが

は、私は単純にページのHTMLを取得し、テキストファイルとして出力することにより、それをテストしていて起動します。 (私はそれゆえ.TXT、Windowsを使用しています。)

import sys 
import requests 

sys.stdout = open('html.txt', 'a') 

content = requests.get('http://www.york.ac.uk/teaching/cws/wws/webpage1.html') 

content.text 

私が行うと、この(すなわち、最後の2行)のpythonコマンドライン(>>>)には、私は私が期待するものを手に入れます。このスクリプトでそれを実行し、通常のコマンドラインから実行すると、結果のhtml.txtは空白になります。私はprint(content)を追加する場合は、html.txtしか含まれています:<応答[200] >。

は、誰もがここで何が起こっているのかを解明することはできますか?また、あなたはおそらく言うことができるように、私は初心者だし、私は私の人生のためにデータを送信するために要求を使用する方法について説明し、初心者レベルのチュートリアルを見つける(または[2]又はセレンをurllibはまたは何でも)することはできませんWebページに追加して結果を取得します。ありがとう!あなたが欲しい

+0

対話型インタプリタは、入力した式の戻り値を常に表示します。そのため、[REPL(Eval Print Loopを読む)](https://en.wikipedia.org/wiki/Read %E2%80%93eval%E2%80%93print_loop)。それは、インタラクティブなインタプリタの特別な動作で、通常のスクリプトは表示されません。スクリプトに値を表示するには、明示的に 'print'する必要があります。 –

答えて

2

import sys 
import requests 

result = requests.get('http://www.york.ac.uk/teaching/cws/wws/webpage1.html') 
if result.status_code == requests.codes.ok: 
    with open('html.txt', 'a') as sys.stdout: 
     print result.content 

要求は、タイプrequest.Responseのインスタンスを返します。あなたはそれを印刷しようとしたとき、__repr__方法は、このようになりますこれは、と呼ばれていました:

<Response [200]>がどこから来たのである
def __repr__(self): 
    return '<Response [%s]>' % (self.status_code) 

requests.Reponseにはcontent属性があります。この属性は、HTMLを含むstr(またはbytes、Python 3の場合)のインスタンスです。

text属性は、またはあなたが望むものであってもなくてもよいタイプunicodeです。コメントには、ファイルに書き込もうとしたときにUnicodeDecodeErrorが表示されたことが記載されています。上記のprint result.contentprint result.textに置き換えることができましたが、そのエラーは発生しませんでした。

unicodeの問題を解決するためのサポートが必要な場合は、このunicode presentationをお読みください。それは理由と解読をいつunicodeを符号化するかについて説明します。

+0

ありがとうございます。それはうまくいった。なぜそれは働いたのですか? –

+0

私はなぜそれが働いたのかについてのメモを追加しました。より多くの情報が必要な場合は、私に知らせてください。 –

+0

私の任意の「コンテンツ」を変数名として選択することも問題でしたか? –

2

対話型インタプリタは、を生成しないすべての式の結果を返します。これは通常のスクリプトでは発生しません。

使用printに明示的にエコー値は:

print response.content 

は、私はあなたがいない、さらにエンコード情報をstdoutをファイルにリダイレクトしているよう がここバージョンを、デコード前に使用しました。

ます。ただし、ファイルへの出力を直接書く方が良いと思います:

with open('html.txt', 'ab') as outputfile: 
    outputfile.write(response.content) 

これは、直接ファイルに、デコードされていない、レスポンスボディを書き込みます。

+0

私は実際にそれを試み、それは動作しませんでした。私は "UnicodeEncodeError: 'ascii'コーデックではエンコードできません..." yada yada。 –

+0

@MarcAdler:Pythonバージョンを指定しなかったのは、 'response.text'です。私はPython 3を想定していました.Python 2では、印刷時に' response.content'に固執してください。 –

+0

申し訳ありません、それは2.7です。 –