鱼C论坛

 找回密码
 立即注册
查看: 7270|回复: 10

python关于字节码转换为字符串的错误

[复制链接]
发表于 2014-8-26 22:20:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import urllib.request
  2. response = urllib.request.urlopen('http://www.baidu.com/')
  3. html = response.read().decode('utf-8','ignore')
  4. print(html)
复制代码
关于python3 抓取网页源码如何正确的输出?百度首页等别的一些网站,源码能够抓取,可是输出都是报错的,提示有字符编码错误?有没有解决方案?decode('utf-8','ignore')这些加上也一样有问题。如何完美的输出各种源码?
如果把抓取的字节码bytes直接wb写入文件,本地打开文件,可以看到源码抓取是正常的,一旦想输出到屏幕上,就各种报错。
应该是网页里面有特殊字符,导致乱码。就是这样的情况下该如何解决了?目前很多网站都有这样的情况,导致希望输出网站的源码的时候,总是有问题。百度谷歌N次无果,求助于鱼C论坛,望各位不吝指教。

还有就是IDLE下,有些网站的源码可以完美的输出,但是直接双击用python打开,命令行下,就又会出现错误。比如谷歌翻译:http://translate.google.cn/。

  1. 'gbk' codec can't encode character '\u200b' in position 14647: illegal multibyte sequence
复制代码

在此先表示感谢!!或者也有研究python写点HTTP相关小工具的也请加QQ:6590048

最近打算写几个小工具:1.批量查询网站百度权重工具(已完工)2.蜘蛛模拟器(模拟搜索蜘蛛抓取网页源码),结果遇到以上问题,哎,悲剧。3.批量POST/GET操作网页,这个工具也需要能够回显,so,同上如何完美输出源码了?

人生最大的悲剧莫过如此啊,万事俱备,只欠东风!再次表示感谢吧 !!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-8-27 09:49:44 | 显示全部楼层
什么东西。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-27 11:27:21 | 显示全部楼层
我这用urllib也出编码错误,不过我是ASCII转错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-27 15:42:40 | 显示全部楼层

看看谁能完美的输出百度首页的源码,问题就这么简单。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-27 15:46:02 | 显示全部楼层
shuoye 发表于 2014-8-27 11:27
我这用urllib也出编码错误,不过我是ASCII转错误

百度首页有一些特殊字符 不论如何转码 gbk utf-8都是打印不出来的,但其他的编程语言如PHP就能够很简单抓取源码。为何python不行了,对于一些网站没有特殊字符的情况下,很简单就能输出,只要decode编码正确,但目前有太多的网站有特殊字符在里面,希望输出源码就是个大问题!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-27 15:56:22 | 显示全部楼层
看来还是无人能解啊,悲剧:mad:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-27 16:50:54 | 显示全部楼层
你无法去预测对方的网站使用什么神奇的编码,最好的编程方式就是让它自己告诉你它用了什么编码,因此:

  1. >>> response = urllib.request.urlopen('http://bbs.fishc.com')
  2. >>> content =  response.read().decode(response.headers.get_content_charset())
  3. >>> print(content)
复制代码


最后希望朋友作品完成后,发上来大家一起交流学习哈^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-27 18:07:33 | 显示全部楼层
小甲鱼 发表于 2014-8-27 16:50
你无法去预测对方的网站使用什么神奇的编码,最好的编程方式就是让它自己告诉你它用了什么编码, ...

你这个获取headers头部信息得到编码,有时候会获取不到 Content-Type: text/html,有的服务器不会返回,我是通过 1.headers头部信息得到编码,2.正则匹配网站源码获得<meta头编码,编码能够获得,只是如何正确的输出才是问题,我刚刚研究了会,发现是因为locale.getpreferredencoding()默认的编码的问题,每个平台的默认编码不同,win的一般是cp936,别的平台又不同,然后输出源码的时候,并不会因为我们上面获得的编码而输出,输出会默认使用当前系统编码输出,结果就会导致源码获取正常,想打印出来就编码出错。刚刚通过修改cmd的默认编码改为utf-8(65001)之后,百度首页能够打印显示源码了。

关于分享,因为目前还没有完美的解决方案,我觉得放出来有点不负责任,使用起来还是有以上问题,所以我再想如何解决。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-27 20:35:40 | 显示全部楼层
lyke 发表于 2014-8-27 18:07
你这个获取headers头部信息得到编码,有时候会获取不到 Content-Type: text/html,有的服务器不会返回, ...
  1. import urllib.request

  2. response = urllib.request.urlopen('http://www.baidu.com')
  3. content = response.read().decode('utf-8', 'ignore')

  4. f = open('baidu.txt', 'w', encoding='utf-8')
  5. f.write(content)
  6. f.close()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-28 14:45:48 | 显示全部楼层
如果把抓取的字节码bytes直接wb写入文件,本地打开文件,可以看到源码抓取是正常的,一旦想输出到屏幕上,就各种报错。


写入文件正常,是必须的,关键是如何输出。

昨晚我查到这2个帖子,应该能有个完美的说明问题了。但是,问题照样无法解决!这就是传说中的Python,没办法!!!

python3 向命令行输出utf8的问题 - V2EX:http://www.v2ex.com/t/98936
Python的控制台输出语句print的一个bug:http://apoo.bokee.com/7028948.html
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-28 23:02:19 | 显示全部楼层
哈哈哈哈,如此坑爹的编码问题,还是让哥来终结吧!!!
直接上代码:
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # Files Name: 读写文件.py
  4. # Release By: Lyke.cc

  5. import locale

  6. def Echo(Str):
  7.     '''像PHP的ECHO一样完美的输出文件数据,自适应各种平台编码,彻底解决坑爹的编码问题! -- By Lyke.cc'''
  8.     try:
  9.         print(Str) # 尝试输出原始文件数据
  10.     except UnicodeError:
  11.         Charset=locale.getpreferredencoding()
  12.         print(Str.encode(Charset,'ignore').decode(Charset,'ignore')) # 输出自适应平台编码的文件数据

  13. # Python3读写文件: r => 文本只读 w => 文本重写(不存在则创建) a => 文本追加(不存在则创建) X+b => 二进制读写
  14. try:
  15.     with open('Test.txt',mode='a',encoding='utf-8',errors='ignore') as File:
  16.         File.write("www.fuck.com I'm法克鱿 &#169; 2001-2013 By 中文524μg/m3\n")

  17.     with open('Test.txt',mode='r',encoding='utf-8',errors='ignore') as File:
  18.         Data=File.read()
  19.         Echo(Data)
  20. except OSError as Err:
  21.     print(Err)
  22. else:
  23.     print('读写文件成功!')
  24. input('按回车键退出:')
复制代码

完美输出各种编码文件,自适应各个平台默认编码环境。本贴内讨论的各种问题,皆因平台默认编码引起,导致此问题各大社区一致无解,表示坑爹。既然起因是默认编码,那我们就在输出时投其所好,编码为默认编码,这样问题就解决了。
注意:Python的默认输出print()会自动根据各个平台的默认编码转换,最坑的是竟然是严格的转换模式,errors='strict',so,各种编码错误就爆出来了。悲剧啊。。。
推荐大家以后输出都使用我上面的Echo函数吧,像PHP的ECHO一样完美的输出文件数据,自适应各种平台编码,彻底解决坑爹的编码问题!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-15 12:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表