最佳表现方式,以提取JSOUP中嵌入资源的链接

时间:2013-10-07 06:28:23

标签: java html performance parsing jsoup

关于解析文档以提取资源链接的最佳方法,我有一个问题。

你在这本食谱中展示:

以下构建DOM表示的方法:

    Document doc = Jsoup.connect(url).get();
    Elements links = doc.select("a[href]");

所以我不确定这是表现最好的方式。

  • 迭代doc.getAllElements()会更好吗?
  • 或者是否有某种类型的SAX解析器?

我在3月3日在JSOUP googlegroups上提出了这个问题,但我不确定我的邮件是否通过了过滤器。

1 个答案:

答案 0 :(得分:3)

最佳表现方式是使用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;