4

リンクの膨大なリスト全体でステータスチェックを実行しています。私のスニペットは次のとおりです。

link = 'http://xyz'
proxyDict = { "http" : "ip:80", "https" : "https://ip:443"}
r = requests.get(link, allow_redirects=False, verify=False)
http_status = r.status_code
print (r.headers)

# check the status and react accordingly

if http_status == 200 and r.headers['content-length'] == "0":
   print ('Link Alive - NO content'+';'+str(http_status)+';'+link, file = log)
elif http_status == 200 and "text/html" in r.headers['content-type']:
   print ('External- direct HTML link'+';'+str(http_status)+';'+link, file = log)  
elif http_status == 200 and "application" in r.headers['content-type']:
   print ('External- direct HTML link'+';'+str(http_status)+';'+link, file = log)

コードを実行すると、次のエラーが発生します。

    return self._store[key.lower()][1]
    KeyError: 'content-length'

ヘッダー出力は次のとおりです。

CaseInsensitiveDict({'status': '200', path=/; HttpOnly, shpuvid=rBBcnFJUTliSHV+hA5lLAg==; expires=Thu, 08-Oct-15 18:26:32 GMT;'connection': 'keep-alive', 'cache-control': 'max-age=0, private, must-revalidate', 'date': 'Tue, 08 Oct 2013 18:26:32 GMT', 'content-type': 'text/html; charset=utf-8', 'x-rack-cache': 'miss'})

header outputキー「content-length」がないためエラーが存在することはわかっていますが、if condition満たされない場合は、発生しない次の条件にジャンプするelif必要があり、上記のエラーをスローしてコードの実行を停止します。

助言がありますか?ばかげた質問かもしれませんが、初心者が学ぶには良いことです。

4

3 に答える 3

10

ブラケット表記を使用する代わりに、辞書から r.headers.get('content-length') を使用します。これは、キー エラーをスローせず、None を返すだけです。

ディクショナリから値を取得するためにどちらの表記法も使用できるのは素晴らしいことです。問題が見過ごされないように、そのキーエラーをスローしたいことがよくあります。この場合、 Dictionary.get() が必要なようです。

于 2013-10-08T18:39:12.753 に答える
3

キー エラーは通常、キーが存在しないことを意味します。

self._store[key.lower()][1] が有効ではない(存在しない)と推測しています

公式のpythonドキュメントから:

例外 KeyError

既存のキーのセットにマッピング (辞書) キーが見つからない場合に発生します。

于 2013-10-08T18:40:09.450 に答える