java - 在 JSOUP 中提取嵌入式资源链接的最佳方式

标签 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 上问过这个问题,但我不确定我的邮件是否通过了过滤器。

最佳答案

最有效的方法是使用 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;

关于java - 在 JSOUP 中提取嵌入式资源链接的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19218305/

相关文章:

java - 我在这里做错了什么(Java)十进制到二进制

java - 需要有关 soap over smtp 的信息

javascript - 选择有空值

html - Bootstrap : order elements with the 'navbar-right' class

.net - 从 CD/DVD 读取速度非常慢,枚举/线程

Python:比较几千个字符串。有没有比较快的选择?

asp.net - ASP.NET/数据库性能检查表

Java - 对 ArrayList 进行排序

java - Android:使用 SSL 交换消息时出现问题

html - 有没有办法从我们嵌入的 You Tube 视频的末尾隐藏 “related videos”?