Java - HtmlUnit parse table without id

HtmlUnit Library讓我們可以利用Java模擬瀏覽器功能來測試網頁,而在這邊主要是針對如果

我們要走訪Html table,取得tr -> td的data,在table沒有設定id的情形下可以怎麼處理。

首先假設我們取得了該頁面的HtmlPage object,而我們要get table的Dom結構如下:

  1. <body>
  2. ....
  3. <table>
  4. <tr>
  5. <td>A</td>
  6. </tr>
  7. <tr>
  8. <td>
  9. <table>
  10. <tr>
  11. <td>1</td>
  12. </tr>
  13. <tr>
  14. <td>2</td>
  15. </tr>
  16. </table>
  17. </td>
  18. </tr>
  19. </table>
  20. ....
  21. </body>

如果table有設id值的話,您就可以透過HtmlTable tableobj = page.getHtmlElementById("table1");

來得到table object,即可以利用HtmlTable定義的method,如官方說明文件提供的範例,如下

  1. for (final HtmlTableRow row : tableobj.getRows()) {
  2. System.out.println("Found row");
  3. for (final HtmlTableCell cell : row.getCells()) {
  4. System.out.println(" Found cell: " + cell.asText());
  5. }
  6. }

但我們要存取的table既沒有設定id,且我們要針對的為巢狀table下的第二個table資料,

回歸一個page能夠透過getElementByid(HtmlPage class定義的method)取得element's object,

當然也可以利用getElementsByTagName針對特定tag,但比較不方便的是沒有table專用的

getRows(), getCells()來用了,但也還好,利用下面的幾行code我們也可以得到。

  1. DomNodeList<DomElement> tablelist = page.getElementsByTagName("table");
  2. DomElement tabledom = tablelist.get(1);
  3. Iterator<DomNode> domiter =  tabledom.getChildren().iterator();

tablelist為一集合List,假設這個頁面只有兩個<table>tag,那麼我們可以想像內層的table即為

第二個index,即1,因此我們表示tablelist.get(1)為第二個table,再來就是直覺的利用

getChildren(),來走訪當下element (table)的children elements,至於怎麼走訪,相信常用HashMap

的人應該蠻熟練的!在此就不多加撰述!

留言