我正在尝试将Python 2.7代码转换为Python 3代码,并且我从urllib请求模块收到类型错误.
我使用内置的2to3 Python工具转换下面的工作urllib和urllib2 Python 2.7代码:
import urllib2
import urllib
url = "https://www.customdomain.com"
d = dict(parameter1="value1", parameter2="value2")
req = urllib2.Request(url, data=urllib.urlencode(d))
f = urllib2.urlopen(req)
resp = f.read()
Run Code Online (Sandbox Code Playgroud)
2to3模块的输出是以下Python 3代码:
import urllib.request, urllib.error, urllib.parse
url = "https://www.customdomain.com"
d = dict(parameter1="value1", parameter2="value2")
req = urllib.request.Request(url, data=urllib.parse.urlencode(d))
f = urllib.request.urlopen(req)
resp = f.read()
Run Code Online (Sandbox Code Playgroud)
运行Python 3代码时,会产生以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-56-206954140899> in <module>()
5
6 req = urllib.request.Request(url, data=urllib.parse.urlencode(d))
----> 7 f = urllib.request.urlopen(req)
8 resp = f.read()
C:\Users\Admin\Anaconda3\lib\urllib\request.py in …Run Code Online (Sandbox Code Playgroud) python 3.5.2
代码1
import urllib
s = urllib.parse.quote('"')
print(s)
Run Code Online (Sandbox Code Playgroud)
它给出了这个错误:
AttributeError:模块'urllib'没有属性'parse'
代码2
from urllib.parse import quote
# import urllib
# s = urllib.parse.quote('"')
s = quote('"')
print(s)
Run Code Online (Sandbox Code Playgroud)
有用...
CODE3
from flask import Flask
# from urllib.parse import quote
# s = quote('"')
import urllib
s = urllib.parse.quote('"')
print(s)
Run Code Online (Sandbox Code Playgroud)
它也有效.因为烧瓶?
为什么我不再有错误?这是一个错误吗?
背景:我正在使用urllib.urlretrieve,而不是urllib*模块中的任何其他功能,因为钩子功能支持(见reporthook下文)..用于显示文本进度条.这是Python> = 2.6.
>>> urllib.urlretrieve(url[, filename[, reporthook[, data]]])
Run Code Online (Sandbox Code Playgroud)
但是,它urlretrieve是如此愚蠢,以至于它无法检测HTTP请求的状态(例如:它是404还是200?).
>>> fn, h = urllib.urlretrieve('http://google.com/foo/bar')
>>> h.items()
[('date', 'Thu, 20 Aug 2009 20:07:40 GMT'),
('expires', '-1'),
('content-type', 'text/html; charset=ISO-8859-1'),
('server', 'gws'),
('cache-control', 'private, max-age=0')]
>>> h.status
''
>>>
Run Code Online (Sandbox Code Playgroud)
下载具有类似钩子支持的远程HTTP文件(显示进度条)和一个不错的HTTP错误处理的最着名的方法是什么?
当我使用python通过urllib2 request或urllib.urlretrieve从url保存图像时,我遇到了问题.这是图像的网址是有效的.我可以使用资源管理器手动下载它.但是,当我使用python下载图像时,无法打开该文件.我使用Mac OS预览来查看图像.谢谢!
更新:
代码如下
def downloadImage(self):
request = urllib2.Request(self.url)
pic = urllib2.urlopen(request)
print "downloading: " + self.url
print self.fileName
filePath = localSaveRoot + self.catalog + self.fileName + Picture.postfix
# urllib.urlretrieve(self.url, filePath)
with open(filePath, 'wb') as localFile:
localFile.write(pic.read())
Run Code Online (Sandbox Code Playgroud)
我想下载的图片网址是 http://site.meishij.net/r/58/25/3568808/a3568808_142682562777944.jpg
此URL有效,我可以通过浏览器保存,但python代码将下载无法打开的文件.预览说"它可能已损坏或使用预览无法识别的文件格式".我比较了我用Python下载的图像和我通过浏览器手动下载的图像.前者的大小要小几个字节.所以似乎文件未完成,但我不知道为什么python无法完全下载它.
我有一段代码,我无法弄清楚如何进行单元测试!该模块使用urllib2从外部XML提要(twitter,flickr,youtube等)中提取内容.这是一些伪代码:
params = (url, urlencode(data),) if data else (url,)
req = Request(*params)
response = urlopen(req)
#check headers, content-length, etc...
#parse the response XML with lxml...
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是挑选响应并加载它以进行测试,但显然urllib的响应对象是不可序列化的(它引发了异常).
仅仅从响应主体保存XML并不理想,因为我的代码也使用了头信息.它旨在作用于响应对象.
当然,在单元测试中依赖外部数据来源是一个可怕的想法.
那么我该如何为此编写单元测试呢?
我应该使用哪个URL解析函数对,为什么?
注意:这是Python 3,没有urllib2.此外,我已经尝试使用json.loads(),我收到此错误:
TypeError: can't use a string pattern on a bytes-like object
Run Code Online (Sandbox Code Playgroud)
如果我使用json.loads()并从响应中删除.read(),我会收到此错误:
TypeError: expected string or buffer
Run Code Online (Sandbox Code Playgroud)
>
import urllib.request
import json
response = urllib.request.urlopen('http://www.reddit.com/r/all/top/.json').read()
jsonResponse = json.load(response)
for child in jsonResponse['data']['children']:
print (child['data']['title'])
Run Code Online (Sandbox Code Playgroud)
不起作用......我不明白为什么.
我正在尝试使用urllib2打开本地文件.我该怎么做呢?当我用urllib尝试以下行时:
resp = urllib.urlopen(url)
Run Code Online (Sandbox Code Playgroud)
它工作正常,但当我切换到:
resp = urllib2.urlopen(url)
Run Code Online (Sandbox Code Playgroud)
我明白了:
ValueError: unknown url type: /path/to/file
Run Code Online (Sandbox Code Playgroud)
那个文件肯定会退出.
谢谢!
我想只使用本机Python库将JSON编码数据发送到服务器.我喜欢请求,但我根本无法使用它,因为我不能在运行脚本的机器上使用它.我需要在没有的情况下这样做.
newConditions = {"con1":40, "con2":20, "con3":99, "con4":40, "password":"1234"}
params = urllib.parse.urlencode(newConditions)
params = params.encode('utf-8')
req = urllib.request.Request(conditionsSetURL, data=params)
urllib.request.urlopen(req)
Run Code Online (Sandbox Code Playgroud)
我的服务器是本地Wamp服务器.我总是得到一个
urllib.error.HTTPError:HTTP错误500:内部服务器错误
我100%确定这不是服务器问题,因为同一台机器上具有相同网址的相同数据与同一服务器一起使用请求库.(也适用于发送POST请求的程序).我无法找出它为什么这样做......我自己编写了API.
当我运行这个:
import urllib
feed = urllib.urlopen("http://www.yahoo.com")
print feed
Run Code Online (Sandbox Code Playgroud)
我在交互式窗口(PythonWin)中获得此输出:
<addinfourl at 48213968 whose fp = <socket._fileobject object at 0x02E14070>>
Run Code Online (Sandbox Code Playgroud)
我希望得到上述URL的来源.我知道这可以在其他计算机上工作(比如在学校的计算机),但这是在我的笔记本电脑上,我不知道这里有什么问题.另外,我根本不理解这个错误.这是什么意思?Addinfourl?FP?请帮忙.
python ×10
urllib ×10
urllib2 ×3
python-3.x ×2
download ×1
http ×1
image ×1
json ×1
python-2.7 ×1
python-3.5 ×1
unit-testing ×1
url ×1
urlparse ×1
urlsplit ×1