抓取中文网页html的编码问题

前言

目前在优达学诚学习python网络爬虫入门课程,课程中的例子都是以维基百科网页为例子进行讲解和实验。本人一边学习一边用中文网页进行实验,遇到了返回的html结果乱码的问题。

1. requests+beautifulsoup抓取时的乱码问题

以百度百科“北京”词条的页面为例,利用requests+beautifulsoup抓取代码如下:

import requests 
from bs4 import BeautifulSoup as bs

html = requests.get('https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC/128981?fr=aladdin')
soup = bs(html.text,'html.parser')
print (soup.title)

返回的结果为乱码:

<title>百度百科——å¨çƒæœ€å¤§ä¸­æ–‡ç™¾ç§‘å¨ä¹¦</title>

经过在网上的学习,获得初步解决方法如下:

import requests 
from bs4 import BeautifulSoup as bs

html = requests.get('https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC/128981?fr=aladdin')
encoding = html.apparent_encoding #获取该页面的字符集编码类型
html.encoding = encoding #使用该编码类型来对页面编码
soup = bs(html.text,'html.parser')
print (soup.title)

此时返回结果可以正常编码:

<title>百度百科——全球最大中文百科全书</title>

2. urllib.request.urlopen抓取时的编码问题

当使用urllib.request.urlopen来获取url的html文本时也会遇到编码问题,此时可以利用chardet模块来检测html文本的编码类型。

import urllib.request
import chardet
import requests

html = urllib.request.urlopen('https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC/128981?fr=aladdin')
html_text = html.read()
ct = chardet.detect(html_text)

观察所获得的ct:
在这里插入图片描述
可以看到,ct为一个dict:第一个键为猜测的编码类型的概率;第二个键为猜测的编码类型。这个结果表示,chardet猜测html_text这个文本有99%的概率为uft-8。将这个编码类型用于html_text的decode:

html_text = html_text.decode(ct['encoding'])

结果可以正常编码:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值