使用 urllib2.urlopen 读取给定 URL 的内容,然后使用 re 解析这些内容并将它们存储到列表中。但是,在存储列表到数据库时遇到了编码问题。
-
尝试使用
req = urllib2.urlopen(forum_url, None, timeout=10)
从给定 URL 读取内容,然后使用url_content = req.read()
读取内容。 -
然后,使用正则表达式解析
url_content
。 -
之后,将内容保存到数据库。
-
如果
url_content
完全是英文,那么一切正常。但是,如果内容中包含中文,则make_insert_sql
会崩溃。 -
可以通过
url_content = req.read().decode('gbk')
来解决这个问题。但是,如果内容完全是英文,那么这次它会崩溃。
2. 解决方案
-
使用
chardet
库来自动检测 URL 内容的编码。 -
如果检测到编码是 GBK,则对内容进行解码。
-
否则,不进行解码。
import urllib2
import re
import chardet
def parse_post_title(content):
url_pattern = "<a href=\"read.php\?tid=.*\" id=\".*\" class=\"subject fl\">(.*)</a>"
title = ''
m = re.search(url_pattern, content)
if m:
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
title = m.group(1)
return title
def make_insert_sql(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)
def main():
forum_url = 'http://www.example.com/forum.php'
req = urllib2.urlopen(forum_url, None, timeout=10)
url_content = req.read()
# 检测编码
encoding = chardet.detect(url_content)['encoding']
# 如果是 GBK,则解码
if encoding == 'gbk':
url_content = url_content.decode('gbk')
# 解析内容
post_list = []
for title in re.findall(r'<a href=\"read.php\?tid=.*\" id=\".*\" class=\"subject fl\">(.*)</a>', url_content):
post_list.append(PostData(title=title))
# 将内容保存到数据库
insert_sql = make_insert_sql(post_list)
cursor.execute(insert_sql)
if __name__ == '__main__':
main()
在上述代码中:
-
使用
chardet.detect(url_content)['encoding']
检测编码。 -
如果是 GBK,则使用
url_content.decode('gbk')
解码内容。 -
然后,解析内容并将其保存到数据库。