我有一个正在NodeJS中开发的程序,该程序利用request
和cheerio
软件包对研究项目进行了一些抓取。抓取的部分数据是新闻文章标题。抓取这些标题中的某些标题时,扩展特殊字符(例如-大破折号)在网页中被读为?—?
。这就是我获取页面并将其加载到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 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
中提供的request
和npm
的最新版本。
编辑:此后,我发现this question遇到了类似的问题。我尝试通过字符代码57399(这是该人所经历的)来删除字符,但仍然没有将其删除。将尝试识别问号的字符代码。
答案 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), " ");