请求NodeJS正确编码正文
我试图抓取一些网页的一些数据,我设法发布一个请求,并得到正确的数据。 问题是我得到如下的东西:
“Kannst du bitte noch einmal … erz??hlen ,wie du w ?and h? hrend der Safari einen L??Wen verjagt hast?”
通常erzählen – wä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文件时,将使用元标记中定义的charset
或content-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');
在request
callback中,将所有内容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); ); }