Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jsoup组合多个计算器_Java_Jsoup - Fatal编程技术网

Java Jsoup组合多个计算器

Java Jsoup组合多个计算器,java,jsoup,Java,Jsoup,我有以下代码: Document dom = Jsoup.parse(htmlString); Evaluator aTag = new Evaluator.Tag("a"); Evaluator linkClass = new Evaluator.Class("foo"); Evaluator hrefContains = new Evaluator.AttributeWithValueContaining("href", &quo

我有以下代码:

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
s


如何在同一个select中应用多个
求值器?

您可以使用select方法,将求值器解析为字符串,并将它们连接起来,而and链接没有分隔符,或or链接的分隔符是逗号。例如:

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);
Evaluator all=新的Evaluator.allegements();
可选目标=单据选择(全部)
.stream()
.过滤器(e->e.is(aTag))
.过滤器(e->e.is(链接类))
.过滤器(e->e.is(hrefContains))
.findFirst();
target.ifPresent(System.out::println);

如果它还不存在,您可以编写自己的
Evaluator
子类,它获取其他Evaluator的列表,并对它们执行and或or操作。