【问题标题】:Module request how to properly retrieve accented characters? � � �模块请求如何正确检索重音字符? ???
【发布时间】:2011-11-30 20:25:39
【问题描述】:

我正在使用:Module: Request -- Simplified HTTP request method 抓取带有重音字符 á é ó ú ê ã 等的网页。

我已经尝试过encoding: utf-8,但没有成功。我仍然在结果中得到这个 ��� 个字符。

request.get({
    uri: url,
    encoding: 'utf-8'
    // ...

有什么配置可以解决吗?

我不知道这是否是一个问题,但我filled one for this module。还没有答案。 :/

【问题讨论】:

  • 嗯,网页是用什么编码写的? utf8?异物?
  • 我在问题中回答了你 (github.com/mikeal/request/issues/118#issuecomment-2965894)。我不知道为什么,但我使用“二进制”进行编码并且它有效。
  • 对我来说也是如此,只需添加encoding: binary 效果很好
  • @renatoargh,在该网站更改编码之前它会很好用。之后它会突然破裂。请改用 iconv,并根据内容类型进行适当的解码,除非您正在做一次性工作并且不在乎。
  • @alex 我去看看!这是一项重要的工作,谢谢

标签: node.js request web-scraping


【解决方案1】:

由于二进制文件已被弃用,使用 iconv 并正确处理解码似乎是一个更好的主意:

var request = require("request"), iconv  = require('iconv-lite');
var requestOptions  = { encoding: null, method: "GET", uri: "http://something.com"};

request(requestOptions, function(error, response, body) {
    var utf8String = iconv.decode(new Buffer(body), "ISO-8859-1");
    console.log(utf8String);
});

重要的部分是将HTTP请求的编码设置为空encoding: null

【讨论】:

  • 这很好用,但我有两个问题。 1. 为什么需要为body创建新的Buffer?我尝试直接使用 body 并没有看到任何区别。我想念什么? 2.如果网页显示charset=utf-8,为什么我必须使用iconv-lite来转换成ISO-8859-1?
【解决方案2】:

将编码指定为utf8 而不是utf-8。以下是来自the Node.js documentation 的缓冲区的可能编码列表。

  • ascii - 仅适用于 7 位 ASCII 数据。这种编码方式速度非常快,设置后会去掉高位。
  • utf8 - Unicode 字符。许多网页和其他文档格式使用 UTF-8。
  • base64 - Base64 字符串编码。
  • 'binary - 一种仅使用每个字符的前 8 位将原始二进制数据编码为字符串的方法。这种编码方法已被贬低,应尽可能避免使用 Buffer 对象。此编码将在 Node 的未来版本中移除。

【讨论】:

  • utf-8 作为 utf8 工作。我要报废的页面是 iso-8859-1。唯一对我有用的编码是“二进制”……太奇怪了……我们在这里讨论过github.com/mikeal/request/issues/118
  • 二进制对我有用。我正在使用请求模块,我在选项中传递了 encoding: 'binary' 。谢谢
【解决方案3】:

我试过了,没问题 (Shift_JIS):

var concat  = require('concat-stream'),
    Iconv   = require('iconv').Iconv,
    request = require('request');

var conv = new Iconv('Shift_JIS', 'utf8'),
    req  = request('http://www.alc.co.jp/');

req.pipe(conv);

req.on('error', function() {
    console.log('an error occurred');
});

conv.pipe(concat(function(body) {
    console.log(body.toString());
}));

https://github.com/request/request/issues/1080#issuecomment-56172161

【讨论】:

    【解决方案4】:

    不是对 OP 的直接回答,但我讨厌类似的问题,可能会对某人有所帮助。

    我遇到了这个问题,因为有一个 gzip 压缩,所以需要先解压缩

    var headers = {
            'Accept-Encoding': 'gzip',
        };
    request({url:url, 'headers': headers, encoding:null},(e,r,b)=>{zlib.gunzip(b, (e,b)=>{console.log(b.toString())}) })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2018-09-27
      • 2020-04-11
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      相关资源
      最近更新 更多