NodeJS 未检测或删除已抓取的 question-marks (?) HTML

NodeJS not detecting or removing question-marks (?) in scraped HTML

我有一个用 NodeJS 开发的程序,它利用 requestcheerio 包为研究项目做一些抓取。被抓取的部分数据是新闻文章标题。在抓取其中一些标题时,扩展的特殊字符(如 —、大破折号)在网页中被读取为 ?—?。这就是我获取页面并将其加载到 cheerio 中的方式。问号存在于纯 html 响应和 cheerio object.

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);
            }
        });
    });
}

原始标题中不存在围绕特殊字符的这些 question-marks,因此我试图删除它们(在这个过程中我最终也删除了大破折号,尽管那不是真的是个问题)。我尝试过的很多解决方案似乎都不起作用。这是我尝试过的一些方法,包括以下 SO 问题中列出的答案:

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("??", " — ");

我想我可能可以获得 出现位置的索引,并删除它左右各一个索引的字符,尽管这似乎是不得已的做法。

此外,从字符串中删除常规问号似乎也不起作用。例如,如果我的标题是 "This is a title?",而我一直在对问号(例如 .replace(/[?]/gi, "");)执行所有这些替换操作,它也不会删除这些问号。

我是不是漏掉了什么?我感觉问号是某种 non-english 字符而不是真正的问号,尽管我不确定它是什么。 如何删除 ?—? 并将其替换为

我的 Node 版本是 v10.15.0,我使用的是 npm.

的最新版本 cheeriorequest

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

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

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

我还想用常规问号替换这些异常字符中的任何其他字符,所以我也这样做了:

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

编辑: 搜索字符,it looks like it's actually a hair space 不是问号。所以我没有用普通的问号替换它们,而是用普通的 space.

替换它们
.replace(new ReqExp(abq), " ");