requests 编码猜测 和encoding使用

在爬取12306网站时 print(response.text)发现会出现乱码情况

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>
中å½é路客æ·æå¡ä¸­å¿
</title>
<head>
<script lang="JAVASCRIPT">
var url = location.host;
//var url = "www.12306.cn";
var url_ky=location.href;
//var url_ky="http://kyfw.12306.cn/cc"
var reg1 = new RegExp("^http://kyfw.12306.cn/(.+)") //å½è®¿é®http://kyfw.12306.cn/*æ¶ï¼éå®åè³https://kyfw.12306.cn/*
var reg2 = new RegExp("^http(s)?://kyfw.12306.cn(/)?$") //å½è®¿é®http://kyfw.12306.cnæhttps://kyfw.12306.cnæ¶ï¼éå®å为https://kyfw.12306.cn/otn
var newUrl="";
//console.log("reg1:"+reg1.test(url_ky))
//console.log("reg2:"+reg2.test(url_ky))
if(reg1.test(url_ky))
{
   newUrl=url_ky.replace(reg1,"https://kyfw.12306.cn/$1");
   window.location=newUrl;
}else if(reg2.test(url_ky)){
   newUrl=url_ky.replace(reg2,"https://kyfw.12306.cn/otn");
   window.location=newUrl;
}else if(url=="www.12306.cn"||url=="www.95306.cn"){
   window.location="/mormhweb/";
}else if(url=="kyfw.95306.cn"){
   window.location="/otn/";
}


/*
if(url=="www.12306.cn")
{
   window.location="/mormhweb/";
}
else
{

   if(url=="wap.12306.cn")
   {
      window.location="/mormhwap/";
   }
   else
   {
      alert("éæ³çå°åï¼æµè§å¨å°å³é­ï¼");
      window.close();
   }
}

*/
</script>
</html> Requests会自动解码来自服务器的内容

经过查询资料requests会根据请求头中的charset来猜测网页解码方式,但是12306的响应体中没有指定charset,那么requests会默认使用ISO-8859-1编码格式(因为requests库是欧洲人写的),但是12306网页是通过utf-8格式来编码的。requests库中提供了一个方法能够查询到网页的编码格式

requests.utils.get_encodings_from_content(response.text)[0])

我们来看一下爬取12306网页 requests的猜测解码和12306网页的编码

print(response.encoding)  # requests猜测的编码格式
print(requests.utils.get_encodings_from_content(response.text)[0])

所以requests的猜测解码方式和网页真正的编码方式不一致导致会出现乱码

这里只需要指定一下requests的猜测方法即可解决问题

response.encoding = "utf-8"
print(response.text)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>
中国铁路客户服务中心
</title>
<head>
<script lang="JAVASCRIPT">
var url = location.host;
//var url = "www.12306.cn";
var url_ky=location.href;
//var url_ky="http://kyfw.12306.cn/cc"
var reg1 = new RegExp("^http://kyfw.12306.cn/(.+)") //当访问http://kyfw.12306.cn/*时,重定向至https://kyfw.12306.cn/*
var reg2 = new RegExp("^http(s)?://kyfw.12306.cn(/)?$") //当访问http://kyfw.12306.cn或https://kyfw.12306.cn时,重定向为https://kyfw.12306.cn/otn
var newUrl="";
//console.log("reg1:"+reg1.test(url_ky))
//console.log("reg2:"+reg2.test(url_ky))
if(reg1.test(url_ky))
{
   newUrl=url_ky.replace(reg1,"https://kyfw.12306.cn/$1");
   window.location=newUrl;
}else if(reg2.test(url_ky)){
   newUrl=url_ky.replace(reg2,"https://kyfw.12306.cn/otn");
   window.location=newUrl;
}else if(url=="www.12306.cn"||url=="www.95306.cn"){
   window.location="/mormhweb/";
}else if(url=="kyfw.95306.cn"){
   window.location="/otn/";
}


/*
if(url=="www.12306.cn")
{
   window.location="/mormhweb/";
}
else
{

   if(url=="wap.12306.cn")
   {
      window.location="/mormhwap/";
   }
   else
   {
      alert("非法的地址,浏览器将关闭!");
      window.close();
   }
}

*/
</script>
</html> 


猜你喜欢

转载自blog.csdn.net/ahua_c/article/details/80942726
今日推荐