Python爬虫新手问题:如何将list结构encode输出为可读的中文字符?

同一个页面,在 pycharm 的输出区,soup.title 是能看的中文字。。。 soup.select 检索到的内容,是\u661f\u671f\u65e5\xa0\xa0 这样的乱码。。。 在网上找这个问题,得到到原因(这个也是网文作者臆测吧?我自己没有能力核实)是因为 BeautifulSoup 在处理问题的时候,都是 UTF-8 视之,

第一问题: 既然 BeautifulSoup 全是 UTF8 一刀切,那么我又搞不懂为什么 title()可以正常输出中文??

按照网上攻略套路,那么我必须得把 select()方法的内容 encode 成 GBK 或者 GB2312, 按目前我的理解,BeautifulSoup 处理的方法,返回的是 list 结构而不是 str

这里问题来了,我见到网上的例子,结构居然可以用 encode(),为啥我的 pycharm + py 2.7 不行,没 encode 方法? 传送门: https://www.jianshu.com/p/69401b84419e https://www.jb51.net/article/49220.htm 这两个文章是不是在害人?

page_req = requests.get(url,headers=headers)
soup = BeautifulSoup(page_req.text,'html.parser')
print(soup.title)
#title 输出正常
print(soup.select('.fl.ps'))
#select()输出的是\u661f\u671f\u65e5\xa0\xa0,UTF8 编码

Python爬虫新手问题:如何将list结构encode输出为可读的中文字符?

9 回复

你确定你的第一行加入了#utf-8 的标志吗


# 问题核心:list包含中文内容时,直接print或str()会显示Unicode编码(如\u4e2d\u6587)
# 解决方案:使用json.dumps()并确保ensure_ascii=False

import json

# 示例数据
data = ["你好", "世界", ["嵌套", "列表"], {"键": "值"}]

# 错误做法:直接输出会显示Unicode编码
print("错误输出:", str(data))
# 输出:['\u4e2d\u6587', '\u4e16\u754c']

# 正确做法:使用json.dumps
result = json.dumps(data, ensure_ascii=False, indent=2)
print("正确输出:")
print(result)

# 如果需要保存到文件
with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

# 如果是requests等库返回的数据,可能需要先检查编码
# 示例:处理网络请求返回的含中文数据
import requests
response = requests.get('某个API')
data = response.json()  # 自动解析JSON
print(json.dumps(data, ensure_ascii=False, indent=2))

关键点:

  • ensure_ascii=False 是核心参数,告诉json模块不要将中文转成ASCII编码
  • indent=2 让输出有缩进,更易读
  • 文件操作时指定encoding='utf-8'

一句话建议:用json.dumps(data, ensure_ascii=False)就能让中文正常显示。

Python 3

print 一个 list,会被 repr,不是很自然嘛?

你就不能把 select 出来的结果遍历一下嘛?

不不不,这个问题和编码什么的没有关系。这个问题的实质是:Python 2 在 print list 等容器数据时,输出的是内部元素的 repr 值,而不是 str 值。

>>> print(‘你好’.str())
你好
>>> print(‘你好’.repr())
’\xe4\xbd\xa0\xe5\xa5\xbd’
>>> print([‘你好’])
[’\xe4\xbd\xa0\xe5\xa5\xbd’]
>>> print([‘你好’][0])
你好
>>> ‘你好’ == ‘\xe4\xbd\xa0\xe5\xa5\xbd’
True
>>> [‘你好’] == [’\xe4\xbd\xa0\xe5\xa5\xbd’]
True

所以 ‘\xe4\xbd\xa0\xe5\xa5\xbd’ 并不是乱码,它和 ‘你好’ 是等价的,只是表示形式的不同,前者是给解释器看的,后者是给人看的。至于 print([‘你好’]) 为什么要显示成 [’\xe4\xbd\xa0\xe5\xa5\xbd’] 而不是 [‘你好’],其实没啥为什么,Python 2 就是这样设计的。

那我想显示 list 里的中文怎么办?

方法一:
改用 Python 3。
>>> print([‘你’, ‘好’])
[‘你’, ‘好’]

方法二:
>>> for i in [‘你’, ‘好’]:
… print(i)



方法三:
>>> import json
>>> print(json.dumps([‘你’, ‘好’], ensure_ascii=False))
[“你”, “好”]

方法四:
https://stackoverflow.com/a/45841899

为什么不使用 Python3

为什么不使用 Python3

看我主页

新手还拿旧版本练手。。。

回到顶部