Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jsoup combine multiple Evaluator

Tags:

java

jsoup

I have this code:

Document dom = Jsoup.parse(htmlString);

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

I know how to use one evaluator

dom.selectFirst(aLinkClass);

But I want to get the first element from dom which matches all 3 Evaluators.

How can I apply multiple Evaluator in same select?

like image 852
KunLun Avatar asked Oct 12 '25 16:10

KunLun


1 Answers

You could use the select method which accepts a string after parsing your evaluators to string and joining them with no delimiter for an AND link or a comma as delimiter for an OR link. Example:

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());

Alternatively you could get all elments from your document and make the filtering on the java side yourself using for example a for loop or streams:

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);
like image 131
Eritrean Avatar answered Oct 14 '25 05:10

Eritrean



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!