shell用curl抓取页面乱码,python抓取并保留html页面时乱码难题的化解方法

By admin in 4858.com on 2019年2月8日

最近写了一个抓取脚本,抓取的多数内容健康,但少部分乱码

shell用curl抓取页面乱码,python抓取并保留html页面时乱码难题的化解方法。新近写了一个抓取脚本,抓取的大部内容健康,但少部分乱码

 

1.是用curl抓取的数码是用类似gzip压缩后的数额造成的乱码。
乱码:curl www.1ting.com |more
乱码:curl -H “Accept-Encoding: gzip”www.1ting.com | more
不乱码:curl -H “Accept-Encoding: gzip”www.1ting.com | gunzip | more

不乱码:curl www.1616.net |more
乱码:curl -H “Accept-Encoding: gzip”www.1616.net | more
不乱码:curl -H “Accept-Encoding: gzip”www.1616.net | gunzip | more

上边的a,b解释的是www.1ting.com,c,d解释是的www.1616.net
a.某个url,假若用不加任何取舍的curl命令抓取后乱码,在curl前面加上Accept-Encoding:gzip,前面不加gunzip,则抓取的数据会乱码。
b.某个url,如若用不加任何取舍的curl命令抓取后乱码,在curl前面加上Accept-Encoding:gzip,前面加上gunzip,则抓取的多寡不会乱码。

c.某个url,假若用不加任何选用的curl命令抓取后不乱码,在curl后边加上Accept-Encoding:gzip,后边不加gunzip,则抓取的数据会乱码。
d.某个url,假如用不加任何接纳的curl命令抓取后不乱码,在curl前面加上Accept-Encoding:gzip,后边加上gunzip,则抓取的数额不会乱码。

小总:
4858.com ,也就是说在curl前面加上Accept-Encoding:gzip,再用gunzip解压缩,则大多可以保留数据不乱码。

2.GBK如故UTF8汉字之类的乱码

iconv命令是运作于linux平台的公文编码装换工具。当大家在linux系统shell下通过curl命令或者wget命令获取一个网页的源代码,当网页的编码与眼前操作系统坏境的安装的编码不一致时,就会发现网页中有成百上千乱码。如在网页”meta”标签”charset”属性值设置为”gb2312″的http://www.baidu.com百度首页,在系统坏境变量”$LANG”值为”en_US.UTF-8″的linux系统即会爆发汉语乱码现象。那时大家得以品味利用iconv命令进行编码装换,让中文不在是乱码。如下命令是处理百度在系统坏境变量”$LANG”值为”en_US.UTF-8″的linux系统乱码的难题的缓解方案之一:

curl -fgb2312 -t utf-8

本来,你也因而转移系统坏境变量与百度首页的”charset”值一致,也得以缓解此乱码难题,如下命令:

set LANG=”gb2312″

export LANG

curl

iconv命令的事无巨细语法:

iconv [选项..] [文件..]
选项:
-f 输入编码
-t 输出编码
-l 列出所有已知的编码
-o 输出文件

 

 

相对而言采取PHP CURL库的POST GETHEADER两种办法之间的歧异

正如POST GETHEADER那二种方法的分别:

参数

POST

GET

HEADER

CURLOPT_URL

CURLOPT_POST

开启

关闭

关闭

CURLOPT_HTTPHEADER

如果有$header,则开启

如果有$header,则开启

如果有$header,则开启

CURLOPT_HEADER

False

False

True

CURLOPT_NOBODY

false

False

true

CURLOPT_POSTFILEDS

True

false

false

从上表中可以见到:

POST方法:开启POST连接,然后发送POST报文体。关闭HEADER和NOBODY

GET方法:关闭POST相关的选项,关闭NOBODYHEADER,仅仅只是开启curlopt_httpheader

HEADER方法:开启HEADER和NOBODY,关闭POST相关的选项。

有道是说上述三种方法,一个醒目的区分是,箱选拔什么样方式的时候,就开启对应的CURL选项。

CURL_HTTPHEADER与CUROPT_HEADER的区别:

前端是安装HTTP底部音讯的一个数组

来人是将头文件的音讯以数据流的章程出口

 

 

转:

python抓取并保留html页面时乱码难点的缓解措施,python抓取

本文实例讲述了python抓取并保留html页面时乱码难题的解决措施。分享给大家供我们参考,具体如下:

在用Python抓取html页面并保存的时候,寻常出现抓取下来的网页内容是乱码的标题。出现该难点的来头一方面是和谐的代码中编码设置有标题,另一方面是在编码设置科学的气象下,网页的实际上编码和标志的编码不合乎造成的。html页面标示的编码在此间:
复制代码 代码如下:<meta
http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

这边提供一种简单的方法缓解:使用chardet判断网页的真实编码,同时从url请求重临的info判断标示编码。假如三种编码分歧,则采取bs模块伸张为GB18030编码;若是一致则直接写入文件(那里安装系统默许编码为utf-8)。

import urllib2
import sys
import bs4
import chardet
reload(sys)
sys.setdefaultencoding('utf-8')
def download(url):
  htmlfile = open('test.html','w')
  try:
    result = urllib2.urlopen(url)
    content = result.read()
    info = result.info()
    result.close()
  except Exception,e:
    print 'download error!!!'
    print e
  else:
    if content != None:
      charset1 = (chardet.detect(content))['encoding'] #real encoding type
      charset2 = info.getparam('charset') #declared encoding type
      print charset1,' ', charset2
      # case1: charset is not None.
      if charset1 != None and charset2 != None and charset1.lower() != charset2.lower():
        newcont = bs4.BeautifulSoup(content, from_encoding='GB18030')  #coding: GB18030
        for cont in newcont:
          htmlfile.write('%s\n'%cont)
      # case2: either charset is None, or charset is the same.
      else:
        #print sys.getdefaultencoding()
        htmlfile.write(content) #default coding: utf-8
  htmlfile.close()
if __name__ == "__main__":
  url = 'http://www.bkjia.com'
  download(url)

获取的test.html文件打开如下,可以看到选择的是UTF-8无BOM编码格式存储的,也就是大家设置的默许编码:

4858.com 1

越来越多关于Python相关内容感兴趣的读者可查看本站专题:《Python编码操作技能计算》、《Python图片操作技能总计》、《Python数据结构与算法教程》、《Python
Socket编程技巧总计》、《Python函数使用技巧计算》、《Python字符串操作技能汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

但愿本文所述对大家Python程序设计有着协助。

本文实例讲述了python抓取并保存html页面时乱码难题的解决办法。分享给我们供大…

 

 

检测字符编码,得出的结果是CP936

检测字符编码,得出的结果是CP936

mb_detect_encoding($str, 'GBK, gb2312, GB18030, ISO-8859-1, ASCII, UTF-8', true)
mb_detect_encoding($str, 'GBK, gb2312, GB18030, ISO-8859-1, ASCII, UTF-8', true)

品味转换此编码,但查获的结果要么乱码

品尝转换此编码,但查获的结果仍然乱码

mb_convert_encoding($str, 'UTF-8', 'CP936');
氓聧掳氓潞娄盲赂聙70氓虏聛猫聙聛氓陇麓莽聦楼盲潞碌7氓虏聛氓楼鲁氓颅漏猫聙聦猫垄芦忙聧聲
mb_convert_encoding($str, 'UTF-8', 'CP936');
氓聧掳氓潞娄盲赂聙70氓虏聛猫聙聛氓陇麓莽聦楼盲潞碌7氓虏聛氓楼鲁氓颅漏猫聙聦猫垄芦忙聧聲

最终发现,这样可以转码

终极发现,那样可以转码

iconv('utf-8', 'latin1', $str);

iconv('utf-8','latin1//IGNORE', $str);
iconv('utf-8', 'latin1', $str);

iconv('utf-8','latin1//IGNORE', $str);

  

  

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有