Nodejs request 模块抓 HTML 之后转格式的问题

Nodejs request 模块抓 HTML 之后转格式的问题

用的 https://github.com/mikeal/request 来抓 HTML

var request = require('request');
var iconv = require('iconv-lite');

request('http://www.78.cn/web/chayouhuo/', function (err, resp, body) {
  var bar = iconv.decode(body, 'GBK');
  console.log(bar);
});

用了 iconv 了, 输出的 bar 还是乱码的。如果先存到本地文件上,再用 iconv 去转码,就不会有问题。求解


4 回复

当然可以!让我们来分析一下这个问题,并提供一个解决方案。

问题分析

你使用 request 模块来抓取网页内容,并且希望将抓取到的 HTML 转换成特定编码(例如 GBK)。然而,你发现直接通过 iconv 解码后的结果仍然是乱码。这可能是由于 request 模块默认返回的数据格式与你的预期不一致。

解决方案

我们可以尝试以下几种方法来解决这个问题:

  1. 确保请求响应体是字符串request 模块默认返回的 body 是一个 Buffer 对象。我们需要将其转换为字符串。
  2. 使用正确的编码:确保在解码时使用正确的字符编码。

以下是修改后的代码示例:

const request = require('request');
const iconv = require('iconv-lite');

// 发送 HTTP 请求并处理响应
request('http://www.78.cn/web/chayouhuo/', { encoding: null }, function (err, resp, buffer) {
  if (err) {
    console.error('Error:', err);
    return;
  }

  // 将 Buffer 转换为字符串,并使用指定的编码进行解码
  const decodedBody = iconv.decode(buffer, 'GBK');

  // 输出解码后的 HTML
  console.log(decodedBody);
});

关键点解释

  1. encoding: null

    • 在发送请求时设置 encoding: null 可以让 request 模块返回一个 Buffer 对象而不是自动转换为字符串。这样我们可以在后续步骤中手动进行编码转换。
  2. iconv.decode(buffer, 'GBK')

    • 使用 iconv 库的 decode 方法将 Buffer 对象转换为字符串,并指定目标编码(如 GBK)。

示例输出

运行上述代码后,你应该能够看到正确解码后的 HTML 内容,而不再是乱码。

总结

通过确保 request 模块返回 Buffer 对象并使用 iconv 正确解码,你可以解决抓取网页内容时出现的乱码问题。希望这个解决方案对你有所帮助!


var request = require(‘request’); var iconv = require(‘iconv-lite’);

request({uri:‘http://www.78.cn/web/chayouhuo/’,encoding:null}, function (err, resp, body) { //body+=""; var bar = iconv.decode(body, ‘GBk’); console.log(bar); }); 你没传headers,也没穿encoding,也网站不知道跟你返回了那种编码,试了一下,这样就好了

感谢回答。顺便推荐下 https://github.com/turingou/gbk ,弄gbk的东西很方便

根据你的描述,你使用 request 模块抓取 HTML 页面后,尝试使用 iconv-lite 转换编码为 GBK,但输出结果仍然是乱码。

这可能是由于 request 模块默认将响应体解码为 UTF-8 字符串。你可以通过设置 encoding: null 来避免这种自动解码,从而保留原始的二进制数据。然后你可以直接使用 iconv-lite 对这些数据进行解码。

以下是一个修改后的示例代码:

const request = require('request');
const iconv = require('iconv-lite');

request({ url: 'http://www.78.cn/web/chayouhuo/', encoding: null }, function (err, resp, body) {
  if (err) throw err;
  if (resp.statusCode !== 200) {
    throw new Error(`请求失败,状态码:${resp.statusCode}`);
  }

  // 使用 iconv-lite 解码为 GBK
  const decodedBody = iconv.decode(body, 'GBK');
  console.log(decodedBody);
});

在这个示例中:

  1. 设置 encoding: null 避免 request 模块对响应体进行自动解码。
  2. 使用 iconv-lite 对原始的二进制数据进行解码为 GBK 编码。
  3. 打印解码后的字符串。

如果你仍然遇到问题,请确保 URL 返回的内容确实是 GBK 编码的,而不是其他编码(例如 UTF-8)。你可以通过检查返回内容的头部信息来确认编码方式。

回到顶部