urllib2.urlopen上的编码问题

时间:2013-04-23 03:47:31

标签: python character-encoding urllib2

这就是我要做的事情:

  1. 使用urllib2读取给定网址的内容
  2. 使用re解析内容并将其存储在列表中
  3. 将列表保存到数据库
  4. 我在这里遇到的问题是:

    我尝试通过以下方式阅读给定网址的内容:

    req = urllib2.urlopen(forum_url, None, timeout=10)
    url_content  = req.read()
    

    然后使用类似以下内容解析url_content:

    def parse_post_title(cls, content):
        url_pattern = "<a href=\"read.php\?tid=.*\" id=\".*\" class=\"subject fl\">(.*)</a>"
        title = ''
        m = re.search(url_pattern, content)
        # ......
        return title
    

    然后保存到db:

    def make_insert_sql(self, post_list):
        insert_list = []
        for post_data in post_list:
            insert_str = u'("%s", "%s", "%s", "%s", %d, %d, "%s", "%s", %d, %d)' % (post_data.forum_name,
                                                                                    post_data.sub_forum, 
                                                                                    post_data.post_name, 
                                                                                    post_data.xxx, 
                                                                                    post_data.xxx, 
                                                                                    post_data.xxx, 
                                                                                    post_data.xxx, 
                                                                                    post_data.xxx, 
                                                                                    post_data.xxx,
                                                                                    post_data.xxx)
            insert_list.append(insert_str)
        return ','.join(insert_list) 
    

    并且如果url_content都说“英语”,那就完美了,那么一切正常。

    如果内容中有一些“中文”内容,那么make_insert_sql会崩溃,但我可以用以下方法解决:

    url_content  = req.read().decode('gbk')
    

    这次,如果内容全部是英文,那么它就会崩溃。

    崩溃信息如:

    'ascii' codec can't decode byte 0xd3 in position 0: ordinal not in range(128)
    

    所以它就像:

    all english -- req.read() OK -- req.read().decode('gbk') - Crash
    english + chinese -- req.read() crash -- req.read().decode('gbk') - OK
    all chinese -- req.read() crash -- req.read().decode('gbk') - OK
    

    所以我想知道的是如何在运行时添加“decode('gbk')”部分?

    任何建议都将不胜感激,谢谢:)

1 个答案:

答案 0 :(得分:0)

看看beautiful soup module。之前在此网站上发布的类似question也可能有所帮助。