我需要帮助用Jsoup抓取网页。我想从hcfactions网页分析玩家个人资料并收集他们的杀戮和死亡。我遇到的问题是每个配置文件页面都是动态创建的,如果玩家有杀人或死亡,则只会有所说的表格。因此,为了告诉我正在解析哪个表,我需要获得在调用之后设置的头文本。
示例网页:http://www.hcfactions.net/index.php?action=playerinfo&player=Djmaddox。
以下是我正在抓取的网页中的html片段:
<table class='table-bordered'><h2 style='text-align:center'>Deaths</h2>
<tr><td>Date</td><td>Reason</td><td>Details</td></tr><tr><td>Dec 11 5:27pm CST</td>.....
我有这个代码来拉取表格并对条目进行计数,但它不会随身携带h2标签供我选择。
public void getPlayerDetails(String name) {
String data = "";
Avatar temp = _db.getPlayer(name);
playerUrl = "http://www.hcfactions.net/index.php?action=playersearch&player=" + name;
try {
// data = Jsoup.connect(url)
// .url(url).get().html();
playerDoc = Jsoup.connect(playerUrl).get();
} catch (IOException ex) {
Logger.getLogger(JParser.class.getName()).log(Level.SEVERE, null, ex);
}
if (playerDoc.select("table").size() == 1) {
return;
} else if (playerDoc.select("table").size() >= 2) {
for (int x = 1; x < playerDoc.select("table").size(); x++) {
System.out.println("deaths");
Element table = playerDoc.select("table").get(x);
Iterator<Element> ite = table.select("tr").iterator();
int count = 0;
while (ite.hasNext()) {
data = ite.next().text();
count++;
}
if (count > 0) {
temp.setDeaths(count - 1);
}
}
}
}
答案 0 :(得分:0)
标记<h2>
位于无效位置。这就是为什么JSoup无法找到它的原因。你必须用正则表达式自己提取它。您可以使用以下代码获取<h2>
的内容:
String tableToString = "<table class='table-bordered'><h2 style='text-align:center'>Deaths</h2>" + "<tr>" + "<td>Date</td>" + "<td>Reason</td>" + "<td>Details</td>" + "</tr>" + "</table>";
String regex = "<h2.*>(.*)?</h2>";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(tableToString);
if (matcher.find()) {
System.out.println(matcher.group(1));
}
您可以使用代码中的tableToString
初始化table.toString()
。
答案 1 :(得分:0)
正如ka3ak所说,<h2>
被错误定位了。但是你不必放弃你的解析器就可以使用正则表达式。假设JSoup是一个不错的HTML解析器(我自己从未使用过它),<h2>
元素应该是紧邻<table>
元素之前的元素。获取“选择”语句以在那里查找。
答案 2 :(得分:0)
Elements headers=playerDoc.select("div.span10.offset1 h2");
恕我直言你的选择接缝有点过于复杂,但也许它必须像那样。无论如何,上面的代码片段将为您提供适当容器中的每个H2标签。
稍后您可以选择所需的表格Elements tables=playerDoc.select("div.span10.offset1 table");
并将适当的数据挖掘到它们上面。标题将与table ofc的顺序相对应。我想,我的工作是在这里完成的:)