2016-12-17 72 views
1

我想在tr中定位特定的td。如何使用java定位HTML文档中的特定td

这是我的代码:

 private void fletch(String name) throws IOException, JSONException { 
      final String iron = "img=2"; 
      final String ui = "img=3"; 
      final String hc = "img=10"; 
      String url = "services.runescape.com/m=hiscore_oldschool/hiscorepersonal.ws?user1="; 

      if (name.toLowerCase().indexOf(iron.toLowerCase()) != -1) { 
       url = "http://services.runescape.com/m=hiscore_oldschool_ironman/hiscorepersonal.ws?user1="; 
      }else if(name.toLowerCase().indexOf(ui.toLowerCase()) != -1){ 
       url = "http://services.runescape.com/m=hiscore_oldschool_ultimate/hiscorepersonal.ws?user1="; 
      }else if(name.toLowerCase().indexOf(hc.toLowerCase()) != -1){ 
       url = "http://services.runescape.com/m=hiscore_oldschool_hardcore_ironman/hiscorepersonal.ws?user1="; 
      } 

      String[] parts = name.split(">"); 
      String part2 = parts[1]; 
      String fin = part2.replaceAll("\\s","+"); 
      url+=fin; 

      Document doc = Jsoup.connect(url) 
        .data("query", "Java") 
        .userAgent("Mozilla") 
        .cookie("auth", "token") 
        .timeout(3000) 
        .post(); 

    //core part 
      Element table1 = doc.select("table").first(); 
       String body = table1.toString(); 
       Document docb = Jsoup.parseBodyFragment(body); 
       Element bbd = docb.body(); 
       String hhk = bbd.toString();  

//This is where i dont know how to target the td data.. Tried this (cant check code so came on here): 
    String overall = bbd.getElementsByTag("td").get(4).text(); 

现在,这给了我这样的HTML代码:

<table cellpadding="3" cellspacing="0" border=0 style="max-width: 355px;"> 
<tr><td colspan="5" align="center"><b>Personal scores for big kurwaaa</b></td></tr> 
<tr> 
<td colspan="2" style="text-align:left;padding-left:24px;"><b>Skill</b></td><td align="right"><b>Rank</b></td><td align="right"><b>Level</b></td><td align="right"><b>XP</b></td> 
</tr> 
<tr><td width="35"></td><td width="100"></td><td width="75"></td><td width="40"></td><td width="75"></td></tr> 
<tr> 

<td></td> 
<td align="left"><a href="overall.ws?table=0&user=big+kurwaaa"> 
Overall 
</a></td> 
<td align="right">7,430</td> 
<td align="right">466</td> 
<td align="right">6,164,312</td> 

</tr> 
<tr> 
<td align="right"><img class="miniimg" src="http://www.runescape.com/img/rsp777/hiscores/skill_icon_attack1.gif"></td> 
<td align="left"><a href="overall.ws?table=1&user=big+kurwaaa"> 
Attack 
</a></td> 
<td align="right">14,475</td> 
<td align="right">19</td> 
<td align="right">4,304</td> 

</tr> 

我想指定的3 TD与每Tr内的数据。例如:

<td align="right">7,430</td> 
<td align="right">466</td> 
<td align="right">6,164,312</td> 

等等从“整体”​​tr到最后。有没有办法以一种简单的方式做到这一点,让我可以选择循环访问数据并创建JSON/map?

PS:新到Java

+0

你想要每个tr的第3个td?或者从每个tr的第3个td到最后td? –

+0

@AshrafulIslam从第三个到最后一个 – CollapsRanger2

回答

0

如果你想获得BBD使用getElementsByTag内的所有TR标签。
它会返回元素,通过它可以通过索引浏览所有tr标签(基于索引0)。如果想跳过前3个tr标签,只需从索引开始循环:3,对于td标签就这样
这里是演示代码:

Elements trList = bbd.getElementsByTag("tr"); 

for (int i = 3; i < trList.size(); i++) { 
    System.out.println("----------------- TR START -----------------"); 
    Elements tdList = trList.get(i).getElementsByTag("td"); 
    for (int j = 2; j < tdList.size(); j++) { 
     System.out.println(tdList.get(j)); 
    } 
    System.out.println("------------------ TR END ------------------"); 
} 
+1

谢谢你这个简单的答案。由于名誉而无法赞成,但非常感谢。 PS。改变了System.out.println(tdList.get(j));到System.out.println(tdList.get(j).text());获取价值。再一次感谢你 – CollapsRanger2

0
 String url = "yourUrl"; 
     Document doc = Jsoup.connect(url).get(); 
     Element table = doc.select("table[class=tableClass]").first(); 
     Iterator<Element> iterator = table.select("td[align=right]").iterator(); 
     iterator.next();//skip first 
     iterator.next();//skip second 
     System.out.println(iterator.next().text()); 
+0

迭代器 iterator = table.select(“td [align = right]”)。iterator();抛出nullpointerex – CollapsRanger2

+0

@ CollapsRanger2我可以很清楚地看到,td align = right存在如此可取地NPE来自表,所以请确保你把它的类的名称 –