0

我正在使用一个 node.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";
    }

当它遇到条件语句时,它会刮一次,然后程序关闭。它不会将所需内容存储为对象的属性。如果不满足条件,它会存储一个设置为“无内容”的 vandalContent 属性。

我想知道的是:甚至有可能像这样在飞行中刮擦吗?抓取是否使程序陷入困境?是否有其他建议的方法来获得类似的结果?

4

1 回答 1

0

我还没有使用nodeio,但签名看起来是一个异步回调,所以从程序流的角度来看,这发生在后台,因此不会阻止下一个语句的发生(下一个语句是你的 if 块之外的任何内容)。

看起来您正在尝试按顺序执行此操作,这意味着您需要重新考虑您希望回调执行的操作,或者通过将整个事情放在一个只有当您有破坏内容时才退出的 while 循环中来强制它按顺序执行(我不推荐)。

对于测试,请尝试在回调中对您的 vandalContent 执行 console.log 并查看它吐出的内容。

于 2012-05-22T16:57:38.697 回答