一些说明
我为什么要写这篇文章?
最近报名了中国大学MOOC的嵩天老师的爬虫课,颇有收获,决定自己找个大学新闻网站练练手,果然还是碰到了臭名昭著的中文字符处理的问题,特此记录。
这篇文章讲什么?
这篇文章讲的是如何把 Python 中的 Dict 转化为 JSON Object 以及 如何把 List 转化为 JSON Array,其中 Dict 和 List 中的数据包括中文,并且如何把这些数据在文件中以正确的方式存入,然后正确地读入到内存中重复使用。关键点在于中文字符的处理,这在 Python2 中一度是一个麻烦的问题,到了 Python3 中稍有改善,但还是需要在读写时做出一些设置。这里详细地讲了设置地地方有哪些。
如何实现
问题讲清楚了,再多说也无益处,直接上代码。
# -*- coding: utf-8 -*-
import json
import requests
from bs4 import BeautifulSoup
import re
import traceback
import codecs
newsList = []
newsDict = {}
r = requests.get('http://news.hunnu.edu.cn/sdxw.htm')
r.encoding = r.apparent_encoding
soup = BeautifulSoup(r.text,'lxml')
newsInfoTags = soup.find_all(id=re.compile('lineu'))
for item in newsInfoTags:
elem = item.contents
# 注意 <class 'bs4.element.NavigableString'> 可自动转换为str
# 所以是否把结果用显式地用str()转换都可以
newsDict['tag'] = elem[3].string
newsDict['title'] = elem[5].string
newsDict['date'] = elem[7].string
newsList.append(newsDict)
# 把数据写入JSON文件中,注意 'utf8' 必不可少
with codecs.open('newsList.json', 'w', 'utf8') as f:
# 注意 ensure_ascii=False 必不可少
f.write(json.dumps(newsList, ensure_ascii=False))
# 从JSON文件中把数据读入内存,注意 'utf8' 必不可少
with codecs.open('newsList.json', 'r', 'utf8') as f:
objs = json.loads(f.read())
print(len(objs))
这里主要用了两个 Python 的内置库,分别是 codecs 和 json,相关使用介绍:
需要注意的地方请参看注释,大致就是这样。值得注意的是,json 这个库特别实用,它可以自动识别 Python/文件 类型,然后把它转换为对应的 文件/Python 类型,这些丰富的库使得 Python 算得上是唯一一门可以称得上是超级语言的编程语言了。