0

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

<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;
4

1 回答 1

1

hasClass以错误的方式使用该方法。

在您的选择中,您将创建一个Elements body包含所有body标签作为Element对象的集合。

public boolean hasClass(String className)

将返回一个truefalse关于您的 Elements 主体中的任何 Element 对象是否在其类属性中具有类名。在这里您会看到问题所在,因为您的集合Elements body仅包含所有body标签,而不包含它们的子节点。您的所有body标签都没有将其类属性设置为pagenav,因此该hasClass()方法将返回false


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

以您的方式选择身体标签将需要一个双循环,例如

    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")){...

但是,由于您只能有一个 body 标签,因此直接选择它会更有效,如下所示

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

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

于 2013-08-21T10:44:59.947 回答