从Request NodeJS更正正文的编码

时间:2017-09-18 06:27:40

标签: javascript node.js web-scraping

我正在尝试为某些数据抓取网页,我设法发布请求并获得正确的数据。问题是我得到了类似的东西:

“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正文?

1 个答案:

答案 0 :(得分:1)

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

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

enter image description here

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

enter image description here

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

嗯,这不适用于你。 从本地计算机读取HTML文件时,元标记中定义的charsetcontent-type将用于编码。

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

这是我访问网站后收到的响应标题。

enter image description here

如您所见,它们没有已定义的字符集。它应位于Content-Type属性中。像这样:

enter image description here

由于响应标头中没有任何指示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);
    );
}