Jsoup 结合多个 Evaluator

Jsoup combine multiple Evaluator

我有这个代码:

Document dom = Jsoup.parse(htmlString);

Evaluator aTag = new Evaluator.Tag("a");
Evaluator linkClass = new Evaluator.Class("foo");
Evaluator hrefContains = new Evaluator.AttributeWithValueContaining("href", "abc");

我知道如何使用一个评估器

dom.selectFirst(aLinkClass);

但我想从 dom 中获取匹配所有 3 个 Evaluator 的第一个元素。

如何在同一个 select 中应用多个 Evaluator

您可以使用 select 方法,该方法在将求值器解析为字符串并将它们连接起来后接受一个字符串,对于 AND link 没有定界符,对于 OR [=17 则使用逗号作为定界符=].示例:

Evaluator aTag         = new Evaluator.Tag("a");
Evaluator linkClass    = new Evaluator.Class("foo");
Evaluator hrefContains = new Evaluator.AttributeWithValueContaining("href", "abc");
    
String all_AND = String.join("",  aTag.toString(), linkClass.toString(), hrefContains.toString());
String all_OR  = String.join(",", aTag.toString(), linkClass.toString(), hrefContains.toString());
    
System.out.println(doc.selectFirst(all_AND).text());

或者,您可以从文档中获取所有元素,然后自己使用例如 for 循环或流在 java 端进行过滤:

Evaluator all = new Evaluator.AllElements();
Optional<Element> target = doc.select(all)
                                .stream()
                                .filter(e -> e.is(aTag))
                                .filter(e -> e.is(linkClass))
                                .filter(e -> e.is(hrefContains))
                                .findFirst();
target.ifPresent(System.out::println);