我可以使用> KRL查询()选择器中的运算符?

时间:2011-03-26 14:18:09

标签: krl

我希望使用KRL query()来获取嵌套的DIV标记,但它会抱怨

ERROR Rules.pm a8x40 show_xfers Ruleset a8x40 failed: html.query error - Invalid specification ">div" in query: div.recent-transfer>div 

这是HTML片段(文件中有多个):

<div class='recent-transfer'>
    <span>...</span>
    <div> <!-- * * * -->
        <div>...</div>
        <div>...</div>
    </div>
</div>

这是我的功能:

recent = function() {
    t = http:get(the_url).pick("$..content");
    t.query("div.recent-transfer>div")
}

我想选择标有* * *的DIV。我是否需要链接几个query()语句来获取DIV?

2 个答案:

答案 0 :(得分:3)

当我尝试重现您的问题时,我没有得到同样的错误。相反,我会得到一个“NOT_FOUND_ERR:DOM例外8”。在我的情况下,选择器根本不是问题;事实上t.query的返回值是一个数组。如果我想在notify()中使用它,我必须从数组中取出第0个元素并返回它。

我不知道你遇到的问题是否相同。但这是一个适合我的示例规则集:

ruleset a163x61 {
  meta {
    name "Selector test"
    description <<
        Testing the query() function
    >>
    author "Steve Nay"
    logging on
  }

  dispatch {
  }

  global {
    the_url = "http://students.cs.byu.edu/~snay2/content.html";

    recent = function() {
        t = http:get(the_url).pick("$..content");
        // This produces an array.
        text = t.query("div.recent-transfer>div");
        // We want the text out of the element. Get the first element.
        text[0];
        // This won't work; throws a "NOT_FOUND_ERR: DOM Exception 8"
        //text;
    };   
  }

  rule first_rule {
    select when pageview ".*" setting ()
    pre {
        disp = recent();
    }
    notify("Content:", disp) with sticky=true;
  }
}

答案 1 :(得分:3)

"div.recent-transfer>div"是有效查询。 KNS出现问题导致间歇性故障。

以下是函数的使用方法,以便返回的数组不会产生问题:

rule add_content {
    select when pageview ".*"
    foreach recent() setting (item) {
        append("div#main", item);
    }
}