Nodejs打印两次

时间:2014-03-03 07:25:28

标签: javascript node.js

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

查看官方documentation

  

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

---编辑---

很抱歉误解,我建议您使用控制台输出编辑您的问题。 我查看了您在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'));
   }
}