NodeJS 未检测或删除已抓取的 question-marks (?) HTML
NodeJS not detecting or removing question-marks (?) in scraped HTML
我有一个用 NodeJS 开发的程序,它利用 request
和 cheerio
包为研究项目做一些抓取。被抓取的部分数据是新闻文章标题。在抓取其中一些标题时,扩展的特殊字符(如 —、大破折号)在网页中被读取为 ?—?
。这就是我获取页面并将其加载到 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
.
的最新版本 cheerio
和 request
编辑: 我发现 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), " ");
我有一个用 NodeJS 开发的程序,它利用 request
和 cheerio
包为研究项目做一些抓取。被抓取的部分数据是新闻文章标题。在抓取其中一些标题时,扩展的特殊字符(如 —、大破折号)在网页中被读取为 ?—?
。这就是我获取页面并将其加载到 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
.
cheerio
和 request
编辑: 我发现 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), " ");