Python:urllib.urlopen的KeyError / IOError

时间:2011-12-04 17:54:10

标签: python json urllib urlopen

我试图将一些文字传递给此readability 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+ +黑烟+人的全+ + +友谊郎+往日'

但是,错误中的URL有效,并在您访问时返回响应。如何编码URL以便我可以使用urlopen?非常感谢。

2 个答案:

答案 0 :(得分:3)

您正在引用完整的网址,包括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 :(得分:1)

使用urllib.urlencode仅对查询字符串进行编码,如下所示:

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

对整个URL进行编码将对斜杠和冒号进行编码,并且您希望这些编码保持未编码状态,以便将其正确解析为URL(而不是错误的本地文件)。