最有效的方法是使用NodeTraversor
访问者模式的实现。它将像其他两个选项一样扫描整个树,但是
- 它不需要解析 CSS 查询并“动态地”匹配它 - 与静态过滤器相比,JIT 优化自定义查询不太可能
- 它不会将元素存储到列表中
getAllElements()
不支持 SAX 解析模型,因为 Jsoup 总是创建一个 DOM 树,因此不需要能力较差的 SAX。也是如此HtmlCleaner
。
final List<Element> elements = new ArrayList<Element>();
new NodeTraversor(new NodeVisitor() {
public void head(Node node, int depth) {
if (node instanceof Element) {
Element element = (Element) node;
if(element.tagName().equalsIgnoreCase("a") && element.hasAttr("href")){
elements.add(element);
}
}
}
public void tail(Node node, int depth) {
}
}).traverse(doc);
return elements;