免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 9389 | 回复: 24
打印 上一主题 下一主题

实用编码问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-05 19:06 |只看该作者 |倒序浏览

  1. #!/usr/bin/env python
  2. #-*-coding:gbk
  3. import urllib,time,os
  4. #import codecs
  5. for i in range(1,10):
  6.     data = urllib.urlopen('http://djangobook.py3k.cn/chapter0%d/'%i).read()
  7.     f=open('0%d.html'%i,'w')
  8.     f.writelines(data)
  9.     f.close()
复制代码

结果生成的html文件是乱码,
怎么才生成的HTML文件正常呀,

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
2 [报告]
发表于 2009-08-05 21:34 |只看该作者

回复 #1 caesarok 的帖子

这个应该先解析一下吧
先看看网页用的什么编码,然后根据此编码进行存储

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
3 [报告]
发表于 2009-08-05 22:19 |只看该作者

  1. #!/usr/bin/env python


  2. import urllib, time, os
  3. import re


  4. URL = 'http://djangobook.py3k.cn/chapter0%d'
  5. FILE = r'0%d.html'
  6. PATTERN = r'charset=\w+-?\d*'


  7. def grabpage():
  8.         for i in range(1, 10):
  9.                 data = urllib.urlopen(URL % i).read()
  10.                 coding = charset(data)
  11.                 if coding is None: continue
  12.                 data = unicode(data, coding)
  13.                 f = open(FILE % i, 'w')
  14.                 f.write(data.encode(coding))
  15.                 f.close()


  16. def charset(text):
  17.         target = re.compile(PATTERN)
  18.         m = re.search(target, text)
  19.         if m is not None:
  20.                 return m.group()[8:]
  21.         return None


  22. if __name__ == '__main__':
  23.         grabpage()
复制代码


处理中文的时候先转换成Unicode,最后再encode写入文件

[ 本帖最后由 openspace 于 2009-8-6 10:29 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-08-06 09:13 |只看该作者

回复 #3 openspace 的帖子

从你这我找到些方法.

http://djangobook.py3k.cn/ 这里有好书,我想用python写个东东全下下来,呵呵.

PATTERN = r'charset=\w+-?\w*'

但是
data = urllib.urlopen('http://djangobook.py3k.cn/chapter0%d/'%i).read()
才能获取到chapter01~chapter10的文章,
需要下 http://djangobook.py3k.cn/chapter02/ 这些文章,
但是我换成这个data 却显示

  1. > "C:\Python25\python.exe" -u "D:\python\python\network\test\get.py"
  2. Traceback (most recent call last):
  3.   File "D:\python\python\network\test\get.py", line 45, in <module>
  4.     grabpage()
  5.   File "D:\python\python\network\test\get.py", line 23, in grabpage
  6.     data = unicode(data, coding)
  7. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 248: ordinal not in range(128)
复制代码


跟我之前想的别的方法一样, 还是不行!

[ 本帖最后由 caesarok 于 2009-8-6 10:06 编辑 ]

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
5 [报告]
发表于 2009-08-06 10:04 |只看该作者

回复 #4 caesarok 的帖子

没看明白你的问题

我试了一下,运行时没有问题,下载的文件显示没有乱码
你是针对这些网页操作的吗

论坛徽章:
0
6 [报告]
发表于 2009-08-06 10:07 |只看该作者

回复 #5 openspace 的帖子

你好! 我是针对这些网页操作

URL = r'http://djangobook.py3k.cn/chapter0%d'
用了r 字符串转换,其实 URL= r'http://djangobook.py3k.cn/chapter0%d' 不管怎么变, 都是 http://djangobook.py3k.cn 首页的内容,

http://djangobook.py3k.cn/chapter01 ~http://djangobook.py3k.cn/chapter09 这些文章,
却不行,


去掉 r 字符串转换,
结果是

  1. > "C:\Python25\python.exe" -u "D:\python\python\network\test\get.py"
  2. Traceback (most recent call last):
  3.   File "D:\python\python\network\test\get.py", line 45, in <module>
  4.     grabpage()
  5.   File "D:\python\python\network\test\get.py", line 23, in grabpage
  6.     data = unicode(data, coding)
  7. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 248: ordinal not in range(128)
复制代码

跟我之前一样,

[ 本帖最后由 caesarok 于 2009-8-6 10:14 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-08-06 10:11 |只看该作者

  1. #!/usr/bin/env python
  2. #-*-coding:us-ascii
  3. import urllib,time,os
  4. import codecs
  5. for i in range(1,10):
  6.     data = urllib.urlopen('http://djangobook.py3k.cn/chapter0%d/'%i').read()
  7.     #f=codecs.open('0%d.html'%i,'w','utf-8')
  8.     f=open('0%d.html'%i,'w')
  9.     f.writelines(data)
  10.    
  11.     f.close()
  12.     time.sleep(1)
  13.    
  14. for j in range(10,21):
  15.     data1 = urllib.urlopen('http://djangobook.py3k.cn/chapter%d/'%j).read()
  16.     #g=codecs.open('0%d.html'%j,'w','utf-8')
  17.     g=open('%d.html'%j,'w')
  18.     f.writelines(data1)
  19.     g.close()
  20.     time.sleep(1)
复制代码

我下来的都是乱码,用us-ascii 没用

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
8 [报告]
发表于 2009-08-06 10:29 |只看该作者

回复 #6 caesarok 的帖子

谢谢LZ提醒,忘了'r'了

是这样的,你用浏览器打开这些网页,看它们的源码
里面会指定字符编码charset
但是有的网页会进一步指定其他的charset

对于页面中这些charset的关系我不是太清楚
前面的例子默认使用了查找到的第一个charset设置,忽略了后面的charset设置,所以会导致解码错误

实际上这个功能类似于小型的爬虫
本人只是了解一下,但是涉及到HTML页面的,就不太理解了

LZ可以查看一下这方面的信息,再通过修改正则表达式进行匹配提取就可以了

PS: 弄清楚后顺便给讲讲:wink:

[ 本帖最后由 openspace 于 2009-8-6 10:30 编辑 ]

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
9 [报告]
发表于 2009-08-06 10:41 |只看该作者
不好意思, 刚刚说错了,又看了一下,页面中就一个charset设置,在head中
比如<meta http-equiv="Content-type" content=
"text/html; charset=us-ascii" />
但是比较奇怪的是页面里面有中文编码,这就不知道怎么显示了

论坛徽章:
0
10 [报告]
发表于 2009-08-06 10:57 |只看该作者
Content-Type        text/html; charset=utf-8

服务器发送的head头是优于html本身的head的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP