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 去转码,就不会有问题。求解
当然可以!让我们来分析一下这个问题,并提供一个解决方案。
问题分析
你使用 request
模块来抓取网页内容,并且希望将抓取到的 HTML 转换成特定编码(例如 GBK)。然而,你发现直接通过 iconv
解码后的结果仍然是乱码。这可能是由于 request
模块默认返回的数据格式与你的预期不一致。
解决方案
我们可以尝试以下几种方法来解决这个问题:
- 确保请求响应体是字符串:
request
模块默认返回的body
是一个 Buffer 对象。我们需要将其转换为字符串。 - 使用正确的编码:确保在解码时使用正确的字符编码。
以下是修改后的代码示例:
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);
});
关键点解释
-
encoding: null
:- 在发送请求时设置
encoding: null
可以让request
模块返回一个 Buffer 对象而不是自动转换为字符串。这样我们可以在后续步骤中手动进行编码转换。
- 在发送请求时设置
-
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,也网站不知道跟你返回了那种编码,试了一下,这样就好了
根据你的描述,你使用 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);
});
在这个示例中:
- 设置
encoding: null
避免request
模块对响应体进行自动解码。 - 使用
iconv-lite
对原始的二进制数据进行解码为 GBK 编码。 - 打印解码后的字符串。
如果你仍然遇到问题,请确保 URL 返回的内容确实是 GBK 编码的,而不是其他编码(例如 UTF-8)。你可以通过检查返回内容的头部信息来确认编码方式。