请帮帮我。我使用了jsoup lib及其方法hasClass
。为什么Cur
会返回“none!”?源页面:
<body>
<div class="pagenav" data-role="vbpagenav" data-pagenumber="2" data-totalpages="223" data-address="showthread.php?t=650495&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;
答案 0 :(得分:1)
您正在以错误的方式使用hasClass
方法。
在您的选择中,您创建了一个集合Elements body
,其中包含body
个Element
个标记作为public boolean hasClass(String className)
个对象。
true
将返回false
或Elements 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
。