收录日期:2020/10/23 10:51:10 时间:2016/07/04 16:42:30 标签:脚本语言(Perl/Python)
代码如下:


#-*- coding: UTF-8 -*-

import urllib,re,sys
from HTMLParser import HTMLParser
from sgmllib import SGMLParser

class MyCode:
    def __init__(self, s):
        self.__codetype = ''
        self.__s = s
    def Decode(self):
        CODES = ['utf-8','gb2312', 'big5','gbk']   
         for code in CODES:
            try:
                 self.__s = self.__s.decode(code)
                 self.__codetype = code
                 print code
                 break
            except:
                 continue
    def Encode(self, codetype):
        self.__s = self.__s.encode(codetype)
        self.__codetype = codetype

    def GetStr(self):
        return self.__s

def txt(html):
    parser = html2txt()
    parser.feed(html)
    parser.close()
    return parser.text

def cn2juhao(txt):
    #data = re.sub('(\s|\xa0)+','',txt)
    #data = data.replace('<NEWLINE>',"\n").strip()
    p = re.compile(r'(。|!|……|】)')
    return p.sub('。\n',txt)

url = "http://house.sohu.com/news/2008-07-28/507972.html"


说明:
之前也出现过这个问题,当
url = "http://news.qq.com/a/20080726/000183.htm"时(charset为gb2312),如下

m = MyCode(s)
m.Decode()#此时是用gbk转换的.
m.Encode('gb2312')#报错,但如果改成m.Encode('utf-8')则正常.
即使我把最初的声明:#-*- coding: UTF-8 -*-改成#-*- coding: gbk -*-也是乱码,此处为m.Encode('gbk')也是乱码,这个太奇怪了,本来网页的charset是gb2312,最后输出却只能是utf-8.

这次出现问题的网页是:
url = "http://house.sohu.com/news/2008-07-28/507972.html"
错误如下:
Traceback (most recent call last):
  File "F:\Python25\error_code.py", line 68, in <module>
    m.Encode('utf-8')
  File "F:\Python25\error_code.py", line 29, in Encode
    self.__s = self.__s.encode(codetype)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd2 in position 23: ordinal not in range(128)
1.我发现经常会有上面标红的情况出现,说某个字符不能转换...

2.我觉得MyCode()可以完善一下,我这里通过MyCode之后成为另一个函数cn2juhao的输入,这就要求输入的是没有乱码的str类型.

还请高人指点,谢谢
str的decode函数其实还有第二个参数。可以为"ignore","replace"等,通过传入正确的参数,可以让decode时遇到的错误被忽略或通过?替换等。
.encode也一样的

>>> url = "http://house.sohu.com/news/2008-07-28/507972.html"
>>> s = urllib.urlopen(url).read()
>>> s.decode('gbk')
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 53133-53134: illegal multibyte sequence
>>> s.decode('gb2312')
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 53133-53134: illegal multibyte sequence
>>> s.decode('utf-8')
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "E:\Program Files\Python24\lib\encodings\utf_8.py", line 16, in decode
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 23-24: invalid data
>>> 

由上可知该网页的字符编码本身就有问题,所以在m.Decode()函数中根本就没有进行正确的解码,所以你后面再对它进行编码时就会抛出异常了。
对应这种网页,你就不要用MyCode类了,就直接根据网页的编码格式进行解码吧。

>>> print s.decode('gb2312', 'ignore')
<html>
<head>
<TITLE>银监会放行中小房企信贷 下半年融资困局或破-房地产门户-搜狐房产</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
谢谢,我调试了一下,你们的办法很好,我还需要改下我的流程

大家对移动pc如何看啊 送分 !! 大家对移动pc如何看啊 送分 !! 请问哪里有SSTab控件下载!!! 有谁用过海南中企网络公司的系统? 怎么设置Bean的路径 为什么\"type=hidden\"的form元素提交后有时不能识别? 关于debug问题! 各位朋友好久不见了我现在失业了 我用redhat linux 7.3上csdn看帖子,帖子中的字挤成一堆(应该是xml页面造成的)如何解决? 高手!csdn文档中心发表文章的那个编辑工具,是怎么样上传文件的呢? 谁知道C++里有什么类库可以查IP地址和网卡地址? 有关数据库输入特殊符号的问题 我不知道该怎么办! 请教一个交换机联网问题?一百大洋送给你,还祝你买体彩中大奖.大哥进来帮帮忙吧,我实在是搞不懂为什么呀 如何写把数据库里的3个字段并成一个字段输出? 大哥们,帮忙啊,我想显示记录号,就是查询分析器中用SQL查出结果后的网格最左边的记录号,大家试试啊,说不清 怎样编网吧记时系统 能不能推荐一本COM入门的书? 如果用电话分机上网呢 怎样防止用户直接修改数据库? 有谁知道在网上有在线翻译的啊,各位兄弟说一下~~!!??有急用~!! 使用DataCombo控件,在执行事件提交操作后,数据便消失???望各路高手相助! 看完了钱能的C++, 然后呢....... 简单的算法问题 SQL Server 可以不要日志吗? 如何确保datewindow和单行文本框中的real型数据是四舍五入后的结果。 这个程序的错误究竟在哪里? vfp急救。 请问如何用代码来创控件 请问安装了.net framework怎么还不能执行.aspx文件,还要额外设置什么?