这是我想做的事情:
- 使用 urllib2 从给定的 url 读取内容
- 使用 re 解析内容并将它们存储在列表中
- 将列表保存到数据库
我在这里遇到的问题是:
我尝试通过以下方式从给定的 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')”部分?
任何建议将不胜感激,谢谢:)