jsoup hasClass返回错误的结果

时间:2013-08-21 07:23:08

标签: java android jsoup

请帮帮我。我使用了jsoup lib及其方法hasClass。为什么Cur会返回“none!”?源页面:

<body>
<div class="pagenav" data-role="vbpagenav" data-pagenumber="2" data-totalpages="223" data-address="showthread.php?t=650495&amp;page=102" data-address2="" data-anchor="">
</div>
</body>

我的代码:

Document doc = null;
String result = "";
try {
    doc = Jsoup.connect(params[0]).get();
    Elements body = doc.select("body");

    /* Navigation */
    String Cur = "";
    if (body.hasClass("pagenav")) {
        Elements Current = body.select("div[data-pagenumber]");
        String Cur1 = Current.attr("data-pagenumber");
        int cur_page = Integer.parseInt(Cur1);
        int next_page = cur_page + 1;
        Cur = Integer.toString(next_page);
    } else {
        Cur = "none!";
    }

    result = body.html() + Cur;

} catch (IOException e) {
    e.printStackTrace();
}
return result;

1 个答案:

答案 0 :(得分:1)

您正在以错误的方式使用hasClass方法。

在您的选择中,您创建了一个集合Elements body,其中包含bodyElement个标记作为public boolean hasClass(String className) 个对象。

true

将返回falseElements body,以确定您的Elements正文中的任何Element对象是否在其class属性中具有类名。在这里,您将看到错误,因为您的集合body仅包含所有body标记,而不包含其子节点。您的pagenav代码都没有将其class属性设置为hasClass(),因此false方法将返回Elements


要解决您的问题,您需要为body标记的所有子节点创建一个新的集合pagenav对象,然后检查它们是否将class属性设置为{ {1}}。

按照你的方式选择body标签需要双循环,例如

    Elements body = doc.select("body");
    Elements bodyChildren = new Elements();
    for (Element e : body) {
        for (Element eChild : e.children()) {
            bodyChildren.add(eChild);
        }
    }

    if (bodyChildren.hasClass("pagenav")){...

虽然,因为你只能有一个身体标签,所以直接选择它可能更有效,如下所示

    Element body = doc.select("body").first();
    Elements bodyChildren = new Elements();
    for (Element e : body.children()) {
        bodyChildren.add(e);
    }

当您在true上运行hasClass()时,上述两种方法都会返回bodyChildren