HTML解析getElementByClass方法

时间:2014-07-07 18:36:09

标签: java html css jsoup

我正在尝试解析html文件而我正在需要从文件中检索表格。

我可以假设getElementsByClass函数按照文件中遇到的顺序返回元素集合吗?同问getElementsByTaggetElementsById

Elements table_rows = tbody.getElementsByClass("table_row");
for(Element tr : table_rows){
    Elements table_datas = tr.getElementsByTag("td");
}

1 个答案:

答案 0 :(得分:0)

Element.getElements *方法按照它们在文档中出现的顺序(使用深度优先前序遍历)返回元素,这可以从源代码轻松验证。首先,Elements.getElementsByClass,使用与类匹配的Evaluator:

public Elements getElementsByClass(String className) {
    Validate.notEmpty(className);
    return Collector.collect(new Evaluator.Class(className), this);
}

其他getElements *方法类似(当然,使用不同的Evaluators)。 getElementById类似,只是它只返回集合中的第一个元素(如果集合为空,则返回null)。

Collector.collect只是设置一个访问者,在第一次遇到元素时添加与Evaluator匹配的元素(预购):

public static Elements collect (Evaluator eval, Element root) {
    Elements elements = new Elements();
    new NodeTraversor(new Accumulator(root, elements, eval)).traverse(root);
    return elements;
}

private static class Accumulator implements NodeVisitor {
    /* uninteresting parts removed */
    public void head(Node node, int depth) {
        if (node instanceof Element) {
            Element el = (Element) node;
            if (eval.matches(root, el))
                elements.add(el);
        }
    }
}

NodeTraversor.traverse被明确记录为对其参数及其所有后代执行深度优先遍历,因此我不会在此处显示代码。