请求NodeJS正确编码正文

我试图抓取一些网页的一些数据,我设法发布一个请求,并得到正确的数据。 问题是我得到如下的东西:

“Kannst du bitte noch einmal … erz??hlen ,wie du w ?and h? hrend der Safari einen L??Wen verjagt hast?”

通常erzählenwährend ,所以Ö,ß,Ü显示不正确。

这里是我的代码:

var querystring = require('querystring'); var iconv = require('iconv-lite') var request = require('request'); var fs = require('fs'); var writer = fs.createWriteStream('outputBodyutf8String.html'); var form = { id:'2974', opt1:'', opt2:'30', ref:'A1', tid:'157', tid2:'', fnum:'2' }; var formData = querystring.stringify(form); var contentLength = formData.length; request({ headers: { 'Content-Length': contentLength, 'Content-Type': 'application/x-www-form-urlencoded' }, uri: 'xxxxxx.php', body: formData, method: 'POST' }, function (err, res, body) { var utf8String = iconv.decode(body,"ISO-8859-1"); console.log(utf8String); writer.write(utf8String); }); 

如何使用正确的字母获取HTML正文?

如何找出响应的正确编码?

我去了你试图抓取的网站,发现这个:

在这里输入图像说明

而另一个字符编码声明在这里:

在这里输入图像说明

这个网站定义了两个不同的字符编码! 我用哪一个?

那么,这不适用于你。 从本地机器读取HTML文件时,将使用元标记中定义的charsetcontent-type进行编码。

由于您正在通过HTTP检索此文档,因此文件将根据响应标头进行编码。

这是我访问网站后收到的响应头文件。

在这里输入图像说明

正如你所看到的,他们没有定义的字符集。 它应该位于Content-Type属性中。 喜欢这个:

在这里输入图像说明

由于它们在响应头中没有任何指示的charset ,因此根据这篇文章 ,它应该使用meta声明。

但是等一下 ,有两个meta charset声明。

由于编译器从头到尾读取文件,因此应该使用第二个声明的charset

结论:他们使用UTF-8

另外,我不认为你需要转换。 我可能是错的,但你应该能够访问回应。

 request({ headers: { 'Content-Length': contentLength, 'Content-Type': 'application/x-www-form-urlencoded' }, uri: 'xxxxxx.php', body: formData, method: 'POST' }, function (err, res, body) { console.log(body); writer.write(body); }); 

编辑我不相信错误是在他们身边。 我相信它在你身边。 试试这个:

删除作者:

 var writer = fs.createWriteStream('outputBodyutf8String.html'); 

requestcallback中,将所有内容replace为:

 function (err, res, body) { console.log(body); fs.writeFile('outputBodyutf8String.html', body, 'utf8', function(error) { if(error) console.log('Error Occured', error); ); } 

所有的代码应该是这样的:

 var querystring = require('querystring'); var iconv = require('iconv-lite') var request = require('request'); var fs = require('fs'); var form = { id:'2974', opt1:'', opt2:'30', ref:'A1', tid:'157', tid2:'', fnum:'2' }; var formData = querystring.stringify(form); var contentLength = formData.length; request({ headers: { 'Content-Length': contentLength, 'Content-Type': 'application/x-www-form-urlencoded' }, uri: 'xxxxxxx.php', body: formData, method: 'POST' }, function (err, res, body) { console.log(body); fs.writeFile('outputBodyutf8String.html', body, 'utf8', function(error) { if(error) console.log('Error Occured', error); ); }