Nodejs打印两次



这里我试图从社交媒体网站中提取特定的细节,但不幸的是,结果或提取的信息打印了两次。所以请给我一个解决这个问题的方法。

var http = require('http');
var options = {
host: 'www.quora.com',
path: '/directory/'
};
callback = function (response) {
var str = ''
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function () {
var match = str.match(/People(.*?)/div>/);
var match1 = match.toString().match(/<a href="/directory/page/(.*?)">(.*?)</a>/g);
for (var index = 0; index < match1.length; index++) {
console.log(match1[index]);
}
});
}
var req = http.request(options, callback);
req.end();

JS中的匹配结果是一个数组,其中

  • 第一个索引是加工字符串
  • 下一个索引正在捕获组

您的控制台中应该有这样的东西。

<a href="/directory/page/something">
something

参见官方文件

返回的数组将匹配的文本作为第一项,然后为每个匹配的捕获括号(包含捕获的文本)提供一项。

---编辑---

很抱歉误解了,我建议你用控制台输出编辑你的问题。我看了一下你在Quora上爬行的页面,我认为问题的根源是第一个正则表达式。

您想要选择人员列表,但是正则表达式会获取所有文本,直到页面的最后一个关闭div标记为止。

使用chrome或FF,打开页面,打开开发控制台,自己尝试一下:

$('body')[0].innerHTML.match('People(.*)/div>');

为了做出这样的选择,我建议使用Cheerio。这是一个非常轻量级的HTML解析器,提供基本的jQuery功能。它将允许您在不使用正则表达式的情况下选择所需的div:

var cheerio = require('cheerio');
...
response.on('end', function () {
$ = cheerio.load(str);
var links = $('.letters').first().find('[href]');
for (var i = 0; i < links.length; i++) {
console.log($(links[i]).attr('href'));
}
}

最新更新