Python: KeyError / IOError с urllib.urlopen - PullRequest
1 голос
/ 04 декабря 2011

Я пытаюсь передать некоторый текст этому API читабельности примерно так:

text = 'this reminds me of the Dutch 2001a caravan full of smoky people Auld Lang Syne'
# construct Readability Metrics API url
request_url = 'http://ipeirotis.appspot.com/readability/GetReadabilityScores?format=json&text=%s' % text
request_url = urllib.quote_plus(request_url.encode('utf-8'))
# make request
j = json.load(urllib.urlopen(request_url))

Я получаю эту ошибку в последней строке:

[Errno 2] Нет такого файла или каталога: 'http://ipeirotis.appspot.com/readability/GetReadabilityScores?format=json&text=this+reminds+me+of+the+Dutch+2001a+caravan+full+of+smoky+people+Auld+Lang+Syne'

Тем не менее, URL в ошибке действителен и возвращает ответ, когда вы посещаете его.Как мне закодировать URL, чтобы я мог использовать urlopen?Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

Вы цитируете полный URL, включая http: //, а что нет. Если вы попытаетесь вывести фактическое значение request_url, вы получите

>>> print request_url
http%3A%2F%2Fipeirotis.appspot.com%2Freadability%2FGetReadabilityScores%3Fformat
%3Djson%26text%3Dthis+reminds+me+of+the+Dutch+2001a+caravan+full+of+smoky+people
+Auld+Lang+Syne

Что не то, что вы хотите. Вы хотите процитировать только те части, которые вы хотите использовать в качестве единственного аргумента для сайта. Я попробовал следующее, и это, похоже, сработало:

text = 'this reminds me of the Dutch 2001a caravan full of smoky people Auld Lang Syne'
# construct Readability Metrics API url
request_url = 'http://ipeirotis.appspot.com/readability/GetReadabilityScores?format=json&text=%s' % urllib.quote_plus(text.encode('utf-8'))
# make request
j = json.load(urllib.urlopen(request_url))
1 голос
/ 04 декабря 2011

Используйте urllib.urlencode для кодирования только строки запроса, например:

request_url = 'http://ipeirotis.appspot.com/readability/GetReadabilityScores?%s' % urllib.urlencode({'format': 'json', 'text': text})

При кодировании всего URL-адреса будут кодироваться косые черты и двоеточия, и вы хотите, чтобы они оставались незашифрованными, поэтому он будет проанализирован правильнокак URL (и не ошибочно принимается за локальный файл).

...