我正在使用一个节点.js项目(使用Wikistream作为基础,所以不完全是我自己的代码),该项目流式传输实时维基百科编辑。代码将每个编辑分解为其组成部分,并将其存储为对象(请参阅 https://gist.github.com/2770152 的要点)。其中一个部分是 URL。我想知道在解析每次编辑时,是否有可能抓取每次编辑的 URL,以显示预编辑和后期编辑的维基百科页面之间的差异,获取差异(例如,在名为"diffchange diffchange-inline"的跨度类中)并将其添加为对象的另一个属性。对,它不能只是一个字符串,不必完全结构化。
我尝试使用 nodeio 并有一些这样的代码(我专门尝试只抓取注释 (m[6]) 中标记为可能的破坏的编辑):
if (m[6].match(/vandal/) && namespace === "article"){
nodeio.scrape(function(){
this.getHtml(m[3], function(err, $){
//console.log('getting HTML, boss.');
console.log(err);
var output = [];
$('span.diffchange.diffchange-inline').each(function(scraped){
output.push(scraped.text);
});
vandalContent = output.toString();
});
});
} else {
vandalContent = "no content";
}
当它命中条件语句时,它会抓取一次,然后程序关闭。它不会将所需的内容存储为对象的属性。如果不满足条件,它确实会存储设置为"无内容"的破坏内容属性。
我想知道的是:是否有可能在飞行中像这样刮? 抓取是否使程序陷入困境?还有其他建议的方法可以得到类似的结果吗?
我还没有使用 nodeio,但签名看起来是一个异步回调,所以从程序流的角度来看,这发生在后台,因此不会阻止下一个语句发生(下一个语句是你的 if 块之外的任何内容)。
看起来您正在尝试按顺序执行此操作,这意味着您需要重新考虑您希望回调做什么,或者通过将整个事情放在一个 while 循环中来强制它是顺序的,该循环仅在您有破坏内容时才退出(我不建议这样做)。
为了进行测试,请尝试在回调中对破坏内容执行控制台.log看看它吐出了什么。