Java - HtmlUnit parse table without id

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

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

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

<body>
....
<table>
    <tr>
        <td>A</td>
    </tr>
    <tr>
        <td>
            <table>
                <tr>
                    <td>1</td>
                </tr>
                <tr>
                    <td>2</td>
                </tr>
            </table>
        </td>
    </tr>
</table>
....
</body>

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

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

for (final HtmlTableRow row : tableobj.getRows()) {
    System.out.println("Found row");
    for (final HtmlTableCell cell : row.getCells()) {
        System.out.println("   Found cell: " + cell.asText());
    }
}

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

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

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

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

DomNodeList<DomElement> tablelist = page.getElementsByTagName("table");

DomElement tabledom = tablelist.get(1);

Iterator<DomNode> domiter =  tabledom.getChildren().iterator();

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

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

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

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

留言