2016-02-18 43 views
1

我正在嘗試使用JSoup解析HTML文檔。我想要做的是提取特定行的表格數據。我希望能夠使用href屬性的值或<a></a>標記的值來選擇所述行。基於行數據從表格行提取值 - JSoup

<tbody> 
    <tr class="even"> 
     <td><a href="link-1">Link_1</a></td> 
     <td align="center">9</td> 
     <td align="center">9</td> 
     <td align="center">2</td> 
    </tr> 
    <tr class="odd"> 
     <td><a href="link-2">Link_2</a></td> 
     <td align="center">22</td> 
     <td align="center">4</td> 
     <td align="center">1</td> 
    </tr> 
    <tr class="even"> 
     <td><a href="link-3">Link_3</a></td> 
     <td align="center">22</td> 
     <td align="center">7</td> 
     <td align="center">1</td> 
    </tr> 
</tbody> 

選擇整個表是容易的,我就可以使用以下方法:

Document htmlRawData = Jsoup.parse(deviceMetricData.toString()); 
Elements htmlMetrics = htmlRawData.select("tbody > tr > td[align]"); 

htmlMetrics.stream().forEach((ele) -> { 
    System.out.println(ele.toString()); 
}); 

這是隻有永遠的理想,當表一行。如果它有很多,那麼根據第一個單元格的值選擇一個特定的行變得更加棘手。

任何人都可以幫助我開始或指向正確的方向嗎?

+0

我不太清楚你想要什麼。你能給出一個你想從該表中提取的輸出的例子嗎?有兩個明顯的選擇:選擇所有的第一個單元格,然後遍歷它們,按索引選擇行;將所有表數據選擇到Java數據結構中,並像往常一樣使用循環進行過濾。 (我至少在幾個小時內回答你的問題,但添加示例輸出將幫助每個試圖回答的人。) –

回答

0

請記住,可以遍歷DOM樹。

Element link = document.select("tbody > tr > td > a[href=\"link-1\"]").first(); 
link.parent().parent().children().forEach(System.out::println); 

您也可以通過這個occurence過濾所有行:

如果你只知道會有總是相同的結構(atd這裏面tr),那麼你可以按如下使它很href值:

final Elements rows = document.select("tbody > tr"); 
rows 
    .stream() 
    .filter(tr -> !tr.getElementsByAttributeValueMatching("href", "link-1").isEmpty()) 
    .findFirst() 
    .map(Element::children) 
    .ifPresent(System.out::println); 

,或者使用選擇:

final Elements rows = document.select("tbody > tr"); 
rows 
    .stream() 
    .filter(tr -> !tr.select("a[href=\"link-1\"").isEmpty()) 
    .findFirst() 
    .map(Element::children) 
    .ifPresent(System.out::println);