Python3 JSON 中文字符读写注意事项

一些说明

  • 我为什么要写这篇文章?

      最近报名了中国大学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,相关使用介绍:

  1. codecs 官方文档
  2. json 官方文档

需要注意的地方请参看注释,大致就是这样。值得注意的是,json 这个库特别实用,它可以自动识别 Python/文件 类型,然后把它转换为对应的 文件/Python 类型,这些丰富的库使得 Python 算得上是唯一一门可以称得上是超级语言的编程语言了。

猜你喜欢

转载自blog.csdn.net/RandomParty/article/details/80030734
今日推荐