1

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

你在这本食谱中展示:

以下构建 DOM 表示的方法:

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

所以我不确定这是最有效的方式。

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

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

4

1 回答 1

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;
于 2013-10-07T07:41:33.803 回答