python3(urlopen)获取网页的坑

首先,python2和python3在导入urlrequest的方式都不一样。
python2是这样:import urllib2
而python3里面把urllib分开了,分成了urlrequest和urlerror,在这里我们只需导入urlrequest即可。from urllib.request import urlopen

然后直接放代码跟着代码讲吧,这个是正确的例子:

    from urllib.request import urlopen
    html = urlopen("http://tieba.baidu.com/")
    content = html.read().decode('utf-8')
    f = open('tieba.html','w',encoding='utf-8')
    f.write(content)
    f.close()

可以看到content=html.read().decode('utf-8')这一句,网上看的全都没有加decode,当我在将其保存进文件时就会提示,不能将byte类型的以str形式存入。

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

当然看到这个错误之后第一想法就是将下面的write函数的参数改成write(str(content))
这么做确实没报错了,但是打开文件后会发现,完全是乱码啊,而且以html格式打开也都是 之类的乱码。

但是加上decode后就没这个问题啦!!

BUT会有新问题产生
接下来如果参照网上的例子,大多是这样f =open('tieba.html','w'),没有encoding,这又会报错:

UnicodeEncodeError: 'gbk' codec can't encode character 'u2022' in position 81636: illegal multibyte sequence

这是因为电脑会默认创建gbk编码的文件,而出于不知名原因存入utf-8编码的文件时就会无法编码,因此只能在open后面设置编码,这样在新创建一个文件的时候就会创建的是utf-8编码的文件了。

如此,才算是正是解决问题。
附一张下载下来运行的图:
这里写图片描述

python2和3之间差别还是不小的,而且诸多细节网上的教程并未说清,还得自己多研究呀。



欢迎大家加入QQ群一起交流讨论,「吟游」程序人生——YinyouPoet

原文地址:https://www.cnblogs.com/yinyoupoet/p/13287554.html