我过去使用过jsoup,但似乎无法理解如何定义选择器之类的jquery。我已经阅读了源代码,但仍然听不懂。
public static final class ContainsOwnText extends Evaluator {
private String searchText;
public ContainsOwnText(String searchText) {
this.searchText = searchText.toLowerCase();
}
@Override
public boolean matches(Element root, Element element) {
return (element.ownText().toLowerCase().contains(searchText));
}
@Override
public String toString() {
return String.format(":containsOwn(%s", searchText);
}
}
上面可以这样称呼
select("*:containsOwn("+ str + ")");
Here is the select
问题:
有人可以向我解释ContainsOwn的工作原理吗?
return String.format(":containsOwn(%s", searchText);
为什么上面不是这样?
return String.format(":containsOwn(%s)", searchText);
And here is the evaluator
我之所以问是因为我想了解jsoup的工作原理,不是我在使它工作时遇到麻烦。我只想知道它是如何完成的。如果我想用类似jquery的选择器来复制这种行为,并想开发类似的东西怎么办?
最佳答案
当您调用select(query)
时,将对该查询进行解析以填充一组评估器,然后将这些评估器传递给Collector以构造满足该查询的一组元素。
在这种情况下,第162行的QueryParser和containsOwn
操作将导致第325行的contains
方法被调用,这将创建ContainsOwn
评估器的实例。
该评估器传递到遍历树的Collector
,该树调用每个评估器的matches
方法。在这种情况下(在ContainsOwn
中),matches
方法使用contains
的java.lang.String
方法检查给定的字符串是否包含在元素的自身文本中。
编写toString
中的ContainsOwn
方法以反映用于创建它的语法,并且对如何创建它没有影响(由QueryParser处理)。缺少封闭的括号看起来像是无害的错字。
关于java - Jsoup如何使jQuery像选择器一样?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17335386/