【问题标题】:Most performing way to extract links to embedded resources in JSOUP在 JSOUP 中提取嵌入式资源链接的最佳执行方式
【发布时间】:2013-10-07 06:28:23
【问题描述】:
我有一个关于解析文档以提取资源链接的最佳方式的问题。
您在这本食谱中的表现:
以下构建 DOM 表示的方法:
Document doc = Jsoup.connect(url).get();
Elements links = doc.select("a[href]");
所以我不确定这是最有效的方式。
- 迭代 doc.getAllElements() 是否更好?
- 或者是否有某种等效的 SAX 解析器?
我在 3 月 3 日在 JSOUP googlegroups 上提出了这个问题,但我不确定我的邮件是否通过了过滤器。
【问题讨论】:
标签:
java
html
performance
parsing
jsoup
【解决方案1】:
最有效的方法是使用NodeTraversor,它是访问者模式的一种实现。它将像其他两个选项一样扫描整个树,但是
- 它不需要解析 CSS 查询并“动态”匹配它 - 与静态过滤器相比,JIT 优化自定义查询不太可能
- 它不会像
getAllElements()那样将元素存储到列表中
不支持 SAX 解析模型,因为 Jsoup 总是创建一个 DOM-tree,所以不需要能力较差的 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;