保存网页TypeError: must be str, not bytes

问题:

import urllib.request
import sys

resp=urllib.request.urlopen("http://www.baidu.com")
html=resp.read()
fo=open("test.html","w")
fo.write(html)
fo.close()

Python 保存网页,后出现如下错误

解决方法:

import urllib.request
import sys

resp=urllib.request.urlopen("http://www.baidu.com")
html=resp.read()
fo=open("test.html",mode="w",encoding='utf-8')
fo.write(html.decode('utf-8'))
fo.close()

说明

首先因为百度的首页是utf-8编码,但是你读取的html是bytes,字节数组,所以必须转为fo能够write的参数类型,因为bytes已经是utf-8编码的,所以解码decode,

然后,如果你用的是windows的操作系统,默认调用open方法打开的文件编码格式是GBK,

这样默认保存的文件显示在浏览器里面是乱码, 因为你页面内容里面指定的是utf-8编码,就是 content="text/html;charset=utf-8" 这个,但是你html文件编码为GBK,所以直接显示乱码。

只有在你open文件的时候,指定保存的编码格式为utf-8。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 07:33:47

保存网页TypeError: must be str, not bytes的相关文章

python TypeError: must be str, not bytes错误

1 TypeError: must be str, not bytes错误: 2 3 解答: 4 写文件处 f=open(filename, 'w')应该写为 open(filename, 'wb') 5 读文件时 f=open(filename,'rb') UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 0: illegal multibyte sequence解决方法同上

Python错误TypeError: write() argument must be str, not bytes

2016-07-03 20:51:25 今天使用Python中的pickle存储的时候出现了以下错误: TypeError: write() argument must be str, not bytes 网上搜索才发现原来是文件打开的方式有问题. 之前文件打开的语句是: f=open("list.pkl","w+") 然后使用二进制方式打开就没有这个问题: f=open("list_account.pkl","wb+") 产

Python 读写文件 中文乱码 错误TypeError: write() argument must be str, not bytes+

今天写上传文件代码,如下 def uploadHandle(request): pic1=request.FILES['pic1'] picName=os.path.join(settings.MEDIA_ROOT,pic1.name) with open(picName,'w') as pic: for c in pic1.chunks(): pic.write(c) return HttpResponse(picName) 出现TypeError: write() argument must

TypeError: write() argument must be str, not bytes报错

TypeError: write() argument must be str, not bytes 之前文件打开的语句是: with open('C:/result.pk','w') as fp: 然后使用二进制方式打开就没有这个问题: with open('C:/result.pk','wb+') as fp: 产生问题的原因是因为存储方式默认是二进制方式. 原文地址:https://www.cnblogs.com/cheng10/p/10107838.html

TypeError: the JSON object must be str, not 'bytes'

json.loads(json_data)报错 修改为json.loads(json_data.decode())即可 一些修改为load什么的方法会带来新的报错… 直接添加decode()解决 描述 Python decode() 方法以 encoding 指定的编码格式解码字符串.默认编码为字符串编码. 语法 decode()方法语法: str.decode(encoding='UTF-8',errors='strict') 参数 encoding -- 要使用的编码,如"UTF-8&quo

HTTPResponse object — JSON object must be str, not 'bytes'

http://stackoverflow.com/questions/24069197/httpresponse-object-json-object-must-be-str-not-bytes HTTPResponse object — JSON object must be str, not 'bytes' up vote17down votefavorite 7 I've been trying to update a small Python library called libpyne

Python3 中的 str 和 bytes

Python3 中的 str 和 bytes 与 Python2.X 不同,Python3.X 严格区分了 str 和 bytes 两种类型.文本为 Unicode,由 str 类型表示:二进制数据则由 bytes 表示. Python3.X 不会以任意隐式的方式混用 str 和 bytes.因此使用者不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然). 例如 Python3.X 中的socket.send()函数,如果传入未编码的字

[转]python str与bytes之间的转换

原文:http://www.cnblogs.com/zqifa/p/python-7.html # bytes object b = b"example" # str object s = "example" # str to bytes sb = bytes(s, encoding = "utf8") # bytes to str bs = str(b, encoding = "utf8") # an alternative

python3 str或bytes转换函数

str或bytes始终返回为str #!/usr/bin/env python # -*- coding: utf-8 -*- def to_str(bytes_or_str): if isinstance(bytes_or_str, bytes): value = bytes_or_str.decode('utf-8') else: value = bytes_or_str return value #Instance of str str或bytes始终返回为bytes #!/usr/bin