【问题标题】:Order of evaluation of Combinators in jsoup selectjsoup select中组合器的评估顺序
【发布时间】:2019-06-20 11:15:56
【问题描述】:

对于例子,如果我写

* > a, b, c > d

输出标签是否会联合

* > a
* > b
* > c > d

或联合

* > a > d
* > b > d
* > c > d

如何获得所需的?

基本上我找不到包含所需详细信息的文档。

【问题讨论】:

    标签: jsoup combinators


    【解决方案1】:

    第一个,但不是真的。更准确地说,输出标签将是:

    * > a
    b
    c > d
    

    我准备了非常简单的 HTML 并在这里进行了测试: https://try.jsoup.org/~D9QmujE_m7rv9G3MahldfKJurfk

    这与我在调试 Jsoup 的代码时得到的一致。 org.jsoup.select.QueryParser 将您的查询解析为 3 个评估者:

    • a :ImmediateParent*
    • b
    • d :ImmediateParentc

    并且结果将包含与这三个中的任何一个匹配的元素,因此这里看起来像 逗号具有最高优先级并用作 OR

    如果您真的想了解内部结构,可以查看this comment in Jsoup's source,其中指出大多数组合符是 AND,但逗号是 OR。如果您不完全理解(我也不理解),请不要担心,但它或多或少都清楚。

    这也与我使用在 try.jsoup.org 上使用的代码打开 html 文件并在浏览器的控制台中运行以下代码时得到的结果一致:

    document.querySelectorAll('* > a, b, c > d');
    

    无论如何,如果你想实现

    * > a > d
    * > b > d
    * > c > d
    

    只需使用选择器:* > a > d, * > b > d, * > c > d 或更短的a > d, b > d, c > d

    【讨论】:

    • 我希望得到一份参考文件。由于没有其他人回应,我接受这个部分答案,它指定逗号 (OR) 具有最高优先级。
    • 这种行为与真正的 Web 浏览器相同,因此可以安全地假设 Jsoup 选择器与真正的 CSS 选择器的工作方式一致(至少在这件事上),所以也许值得一看原始 CSS 选择器规范以获取详细信息w3.org/TR/selectors-3
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多