NodeJS无法检测或删除已刮擦的HTML中的问号(?)

时间:2019-01-14 00:38:06

标签: html node.js web-scraping cheerio

我有一个正在NodeJS中开发的程序,该程序利用requestcheerio软件包对研究项目进行了一些抓取。抓取的部分数据是新闻文章标题。抓取这些标题中的某些标题时,扩展特殊字符(例如-大破折号)在网页中被读为?—?。这就是我获取页面并将其加载到cheerio中的方式。纯HTML响应和cheerio对象中都存在问号。

function aRequest(url){
    return new Promise((res, rej)=>{
        request({
            url: url,
            headers: {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36'
            }
        }, (err, resp, html)=>{
            if(!err){
                res(cheerio.load(html));
            } else {
                rej(err);
            }
        });
    });
}

这些围绕特殊字符的问号在原始标题中不存在,因此我尝试将其删除(在这个过程中,我也最终删除了大破折号,尽管这并不是真正的问题) 。我尝试过的许多解决方案似乎都无效。这是我尝试过的一些方法,包括以下SO问题中列出的答案:

Remove ASCII question mark

Remove all special characters with regexp

特殊字符删除中列出的答案可以删除破折号,但问号仍然存在。我尝试过的某些代码片段无法正常工作:

.replace("?—?", " — ");
.replace(/[^\w\s]/gi, " — ");
.replace("?", "");
.replace(/[?]/gi, " ");
.replace("�", ""); // ASCII question mark
// this is the point I started getting desperate to just have it work
.replace(/[^\w\s]/gi, "").replace("??", " — ");

我认为我可能可以获取所在位置的索引,并删除字符左右两个位置的字符,尽管这似乎是最后的选择。

此外,即使从字符串中删除常规问号似乎也不起作用。例如,如果我的标题为“这是标题?”,而我一直在对问号(如.replace(/[?]/gi, "");之类的所有这些替换操作)中也不会删除这些问号。 / p>

我在这里错过了什么吗?我感觉问号是某种非英语字符,而不是实际的问号,尽管我不确定会是什么。 如何删除?—?并将其替换为

我的节点版本为v10.15.0,我正在使用cheerio中提供的requestnpm的最新版本。

编辑:此后,我发现this question遇到了类似的问题。我尝试通过字符代码57399(这是该人所经历的)来删除字符,但仍然没有将其删除。将尝试识别问号的字符代码。

1 个答案:

答案 0 :(得分:0)

由于某种原因,问号是问号的异常字符代码。字符代码实际上是8202,这就是为什么无法使用标准问号(?)进行替换的原因。使用以下替换代码片段可以替换我想要的问号:

const abq = String.fromCharCode(8202);
.replace(abq+"—"+abq, " — ");

我还想用常规问号替换这些异常字符,所以我也这样做了:

.replace(new ReqExp(abq), "?");

编辑:搜索字符,it looks like it's actually a hair space不是问号。因此,我没有用普通的问号代替它们,而是用普通的空格代替了它们。

.replace(new ReqExp(abq), " ");