0

这是我想做的事情:

  1. 使用 urllib2 从给定的 url 读取内容
  2. 使用 re 解析内容并将它们存储在列表中
  3. 将列表保存到数据库

我在这里遇到的问题是:

我尝试通过以下方式从给定的 url 中读取内容:

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

然后使用 re 解析 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

然后保存到数据库:

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')”部分?

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

4

1 回答 1

0

看看漂亮的汤模块。之前在这个网站上 也发布了一个类似的问题,可能会有所帮助。

于 2013-04-23T03:58:14.537 回答