我正在尝试为某些数据抓取网页,我设法发布请求并获得正确的数据。问题是我得到了类似的东西:
“Kannst du bitte noch einmal ... erzýhlen,wie du wýhrend der SafarieinenLýwenverjagthast?”
通常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正文?
答案 0 :(得分:1)
我去了你试图抓的网站,发现了这个:
这里有另一个字符编码声明:
这个网站定义了两种不同的字符编码! 我使用哪种方式?
嗯,这不适用于你。
从本地计算机读取HTML文件时,元标记中定义的charset
或content-type
将用于编码。
由于您通过HTTP检索此文档,因此将根据响应标头对文件进行编码。
这是我访问网站后收到的响应标题。
如您所见,它们没有已定义的字符集。它应位于Content-Type
属性中。像这样:
由于响应标头中没有任何指示charset
,因此,根据此post,它应使用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
回调中,用以下内容替换所有内容:
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);
);
}