当前位置: 首页 > news >正文

python爬虫中文网页cmd打印出错问题解决

问题描述

用python写爬虫,很多时候我们会先在cmd下先进行尝试。

运行爬虫之后,肯定的,我们想看看爬取的结果。

于是,我们print...

运气好的话,一切顺利。但这样的次数不多,更多地,我们会遇到这样的错误:

UnicodeEncodeError: 'gbk' codec can't encode character

好吧,回去检查网页的编码格式:gb2312

代码中也添加了:r.encoding = 'gb2312'

看不出哪里出了问题,应该没问题的啊!

代码如下:

import requests
from bs4 import BeautifulSoup

url = 'http://bbs.ok226.com/bbs/html/'

r = requests.get(url)
r.encoding = 'gb2312'

soup = BeautifulSoup(r.text, 'html.parser')

# 打印
print(soup.get_text(strip=True))

解决办法:

A.改变控制台编码

网上查,都说是cmd控制台的问题。默认控制台编码gbk

好吧,那就改一下控制台编码,改成gbk的超集gb18030

试试看再说。。。嗯,很好,无报错,但是有乱码,算是解决了问题!

代码如下:

import requests
from bs4 import BeautifulSoup

url = 'http://bbs.ok226.com/bbs/html/'

r = requests.get(url)
r.encoding = 'gb2312'

soup = BeautifulSoup(r.text, 'html.parser')

# 改变控制台编码
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')

# 打印
print(soup.get_text(strip=True))

B.直接改字符编码

顺着这个思路,再一想,改控制台编码那还不如直接改字符编码:r.encoding = 'gb18030'

试试看再说。哎,没问题了,无报错,无乱码,完美解决!

代码如下:

import requests
from bs4 import BeautifulSoup

url = 'http://bbs.ok226.com/bbs/html/'

r = requests.get(url)
r.encoding = 'gb18030' # 注意网页编码是 gb2312

soup = BeautifulSoup(r.text, 'html.parser')

# 打印
print(soup.get_text(strip=True))

总结

从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。

各种编码字符数目

  • gb2312: 7445 -- 在windows中的代码页是CP936
  • gbk: 21886 -- 在windows中的代码页是CP936
  • gb18030: 27484 -- 在windows中的代码页是CP54936
  • gb13000: 等同于unicode

显然,gb18030 是 gb2312,gbk 的超集

因此,解决问题的思路就是:

如果控制台中,打印中文文本出问题,那就用它的编码的超集进行编码

相关文章:

  • Lambda 表达式(C# 编程指南) 微软microsoft官方说明
  • (一)WLAN定义和基本架构转
  • 一道闭包题引发的思考
  • 循环 函数 软件包 【中】
  • Blue Moon响应式后台管理模板
  • 用UltraISO把硬盘文件制作成ISO格式
  • 深入理解SELinux SEAndroid
  • Android初级进阶之自定义View之SafeVeiw
  • 源码安装http2.2.29
  • Making An Indicator With Pure CSS
  • python编程中的if __name__ == 'main': 的作用和原理
  • [raspberry pi3] zram设置
  • MyEclipse Site
  • 金蝶出现问题该怎么解决
  • Access 中数据库操作时提示from子句语法错误
  • Google 是如何开发 Web 框架的
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Android组件 - 收藏集 - 掘金
  • ESLint简单操作
  • Java多线程(4):使用线程池执行定时任务
  • Java精华积累:初学者都应该搞懂的问题
  • Leetcode 27 Remove Element
  • LeetCode18.四数之和 JavaScript
  • mysql 数据库四种事务隔离级别
  • Vue全家桶实现一个Web App
  • yii2权限控制rbac之rule详细讲解
  • 缓存与缓冲
  • 技术发展面试
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端知识点整理(待续)
  • 数据结构java版之冒泡排序及优化
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • ​ArcGIS Pro 如何批量删除字段
  • # C++之functional库用法整理
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • $(selector).each()和$.each()的区别
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (黑马C++)L06 重载与继承
  • (九十四)函数和二维数组
  • (理论篇)httpmoudle和httphandler一览
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十一)c52学习之旅-动态数码管
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET文档生成工具ADB使用图文教程
  • .pyc文件是什么?
  • @Transactional类内部访问失效原因详解
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [20181219]script使用小技巧.txt
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用