这里我试图从社交媒体网站中提取具体细节,但不幸的是结果或提取的信息是打印两次。所以请给我一个解决这个问题的补救措施。
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();
答案 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'));
}
}