これが私がやろうとしていることです:
- 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
次に、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 がすべて「English」である場合は完全に機能しており、すべて正常に機能します。
コンテンツに「中国語」のようなものがある場合、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')」部分を追加する必要があるかどうかをどのように知ることができるかということです。
どんな提案でも大歓迎です、ありがとう:)