tcquinn
tcquinn

Reputation: 413

Handling bad URLs with requests

Sorry in advance for the beginner question. I'm just learning how to access web data in Python, and I'm having trouble understanding exception handling in the requests package.

So far, when accessing web data using the urllib package, I wrap the urlopen call in a try/except structure to catch bad URLs, like this:

import urllib, sys

url = 'https://httpbinTYPO.org/' # Note the typo in my URL

try: uh=urllib.urlopen(url)
except:
    print 'Failed to open url.'
    sys.exit()

text = uh.read()
print text

This is obviously kind of a crude way to do it, as it can mask all kinds of problems other than bad URLs.

From the documentation, I had sort of gathered that you could avoid the try/except structure when using the requests package, like this:

import requests, sys

url = 'https://httpbinTYPO.org/' # Note the typo in my URL

r = requests.get(url)
if r.raise_for_status() is not None:
    print 'Failed to open url.'
    sys.exit()

text = r.text
print text

However, this clearly doesn't work (throws an error and a traceback). What's the "right" (i.e., simple, elegant, Pythonic) way to do this?

Upvotes: 3

Views: 6959

Answers (2)

Andersson
Andersson

Reputation: 52665

Try to catch connection error:

from requests.exceptions import ConnectionError

try:
    requests.get('https://httpbinTYPO.org/')
except ConnectionError:
    print 'Failed to open url.'

Upvotes: 2

Bill
Bill

Reputation: 493

You can specify a kind of exception after the keyword except. So to catch just errors that come from bad connections, you can do:

import urllib, sys

url = 'https://httpbinTYPO.org/' # Note the typo in my URL

try: uh=urllib.urlopen(url)
except IOError:
    print 'Failed to open url.'
    sys.exit()

text = uh.read()
print text

Upvotes: 1

Related Questions