웹 프론트엔드 HTML 튜토리얼 node爬虫之gbk网页中文乱码解决方案_html/css_WEB-ITnose

node爬虫之gbk网页中文乱码解决方案_html/css_WEB-ITnose

Jun 21, 2016 am 08:58 AM

之前在用 node 做爬虫时碰到的中文乱码问题一直没有解决,今天整理下备忘。(PS:网上一些解决方案都已经不行了)

中文乱码具体是指用 node 请求 gbk 编码的网页,无法正确获取网页中的中文(需要转码),"gbk" 和 "网页中的中文" 两个条件是缺一不可的。可以获取 utf-8 编码的网页中的中文,也可以获取 gbk 编码网页中的英文数字等。

举个简单的例子。获取 http://acm.hdu.edu.cn/statistic.php?pid=1000排名第一的答案的 username,是为 "极光炫影"。刷刷刷写下如下代码:

var cheerio = require('cheerio')  , superagent = require('superagent')  , express = require('express');var url = 'http://acm.hdu.edu.cn/statistic.php?pid=1000';var app = express();app.get('/', function (req, res, next) {  superagent.get(url)    .end(function (err, sres) {      var html = sres.text;      var $ = cheerio.load(html, {decodeEntities: false});      var ans = $('.table_text td a').eq(0).html();      res.send(ans);    });  });app.listen(3000, function () {  console.log('app is listening at port 3000');});
로그인 후 복사

得到了乱码,如下:

������Ӱ
로그인 후 복사

如何获取正确的中文呢?这里提供几个解决方案应急(不关心原理,只是为了应急)。

方法一:

使用 superagent-charset模块。

var cheerio = require('cheerio')  , superagent = require('superagent-charset')  , express = require('express');var url = 'http://acm.hdu.edu.cn/statistic.php?pid=1000';var app = express();app.get('/', function (req, res, next) {  superagent.get(url)    .charset('gbk')    .end(function (err, sres) {      var html = sres.text;      var $ = cheerio.load(html, {decodeEntities: false});      var ans = $('.table_text td a').eq(0).html();      res.send(ans);    });});app.listen(3000, function () {  console.log('app is listening at port 3000');});
로그인 후 복사

使用非常简单,只需要引入 superagent-charset模块,且在链式调用时加入 charset 参数即可。superagent-charset 模块包括了 superAgent 模块以及 iconv-lite 模块。源码可以参考 Github。

方法二:

直接用 iconv-lite模块进行转码。

iconv-lite是一个进行编码转换的模块(node 默认编码 utf-8)。需要 decode 的编码必须是 Buffer类型。

  • 用 http模块:

    http.get(url, function(sres) {  var chunks = [];  sres.on('data', function(chunk) {    chunks.push(chunk);  });  sres.on('end', function() {    // 将二进制数据解码成 gb2312 编码数据    var html = iconv.decode(Buffer.concat(chunks), 'gb2312');    var $ = cheerio.load(html, {decodeEntities: false});    var ans = $('.table_text td a').eq(0).html();    res.send(ans);  });});
    로그인 후 복사
  • 用 request模块:

    request({  url: url,   encoding: null  // 关键代码}, function (err, sres, body) {  var html = iconv.decode(body, 'gb2312')  var $ = cheerio.load(html, {decodeEntities: false});  var ans = $('.table_text td a').eq(0).html();  res.send(ans);});
    로그인 후 복사

    用 iconv 进行 decode 传入的参数必须是 Buffer。

    encoding- Encoding to be used on setEncoding of responsedata. If null, the bodyis returned as a Buffer. Anything else ( including the default value of undefined ) will be passed as the encoding parameter to toString()(meaning this is effectively utf8by default). ( Note: if you expect binary data, you should set encoding: null.)

    iconv-lite 模块能配合 http 模块以及 request 模块使用,却不能直接和 superAgent 模块使用。 因为 superAgent 是以 utf8 去取数据,然后再用 iconv 转也是不行的。页面是 gbk 编码的,sres.text 已经是 decode 过了的结果,也就是说它已经被转换成 utf8 了,再转换成 buffer 出来的结果必须是不正确的。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

공식 계정 웹 페이지의 캐싱 업데이트에 어려움 : 버전 업데이트 후 사용자 경험에 영향을 미치는 이전 캐시를 피하는 방법은 무엇입니까? 공식 계정 웹 페이지의 캐싱 업데이트에 어려움 : 버전 업데이트 후 사용자 경험에 영향을 미치는 이전 캐시를 피하는 방법은 무엇입니까? Mar 04, 2025 pm 12:32 PM

공식 계정 웹 페이지의 캐싱 업데이트에 어려움 : 버전 업데이트 후 사용자 경험에 영향을 미치는 이전 캐시를 피하는 방법은 무엇입니까?

HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? Mar 17, 2025 pm 12:27 PM

HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까?

웹 페이지의 PNG 이미지에 뇌졸중 효과를 효율적으로 추가하는 방법은 무엇입니까? 웹 페이지의 PNG 이미지에 뇌졸중 효과를 효율적으로 추가하는 방법은 무엇입니까? Mar 04, 2025 pm 02:39 PM

웹 페이지의 PNG 이미지에 뇌졸중 효과를 효율적으로 추가하는 방법은 무엇입니까?

& lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? & lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? Mar 20, 2025 pm 06:05 PM

& lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까?

iframes 사용의 보안 영향은 무엇이며 어떻게 완화 할 수 있습니까? iframes 사용의 보안 영향은 무엇이며 어떻게 완화 할 수 있습니까? Mar 18, 2025 pm 02:51 PM

iframes 사용의 보안 영향은 무엇이며 어떻게 완화 할 수 있습니까?

HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? Mar 17, 2025 pm 12:20 PM

HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까?

html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? Mar 12, 2025 pm 04:05 PM

html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소?

html5 & lt; meter & gt; 범위 내에 숫자 데이터를 표시하는 요소? html5 & lt; meter & gt; 범위 내에 숫자 데이터를 표시하는 요소? Mar 12, 2025 pm 04:08 PM

html5 & lt; meter & gt; 범위 내에 숫자 데이터를 표시하는 요소?

See all articles