【问题标题】:How to use Xpath in HtmlUnit to get access to table inside a bunch of nested divs如何在 HtmlUnit 中使用 Xpath 来访问一堆嵌套 div 中的表
【发布时间】:2017-01-18 21:01:35
【问题描述】:

我创建了一个程序来使用 HtmlUnit 访问 Web 应用程序。登录应用程序后,我想逐个打开表格中列出的工作,然后转到下一页。不幸的是,该表没有 id 属性,我可以在 HtmlTable 变量的初始化期间使用它来 getElementById。

所以,我决定使用 getByXPath 函数并传递一条路径,系统可以通过该路径识别我所指的表并让我继续前进。我在这里面临的问题是我想要访问的表格嵌套在一堆 div 和一个表格标签下。从层次上讲,我试图访问的表位于下面提到的时尚下

HTML -> 正文 -> 12 个 div -> 表格 -> tbody ->tr -> td -> 10 个 div -> 表格

我无法在 Xpath 函数中从中间开始。所以,我通过以下方式传入了整个路径:

for(int i=0;i<2;i++) {
     final HtmlTable table = (HtmlTable) page2.getByXPath("//html/body/div/div/div/div/div/div/div/div/div/div/div/div/table/tbody/tr/td/div/div[@id='idName']/div/div/div[@class='className']/div/div/div/div/div/table[@class='TableClass']").get(i);
     System.out.println("Printing table: " + table.asText());
} 

我得到的错误如下:

线程“main”java.lang.IndexOutOfBoundsException 中的异常:索引:0,大小:0

由于该表隐藏在大量其他标签下,我不知道如何获得有效的访问方式。

现在,我尝试使用 getChildNodes 函数来获取页面中存在的所有节点并单独列出 Table 节点。代码sn-p在这里:

        List list = page2.getChildNodes();
        int k = 0;
        while(list.iterator() != null)
        {
            HtmlElement anElement = (HtmlElement) list.get(k);
            if(anElement instanceof HtmlTable)
            {
                System.out.println("Hello :" +anElement.asText());
            }
            k =  k + 1;
        }

这里我有一个用于 HtmlElement 强制转换操作的 ClassCastException

【问题讨论】:

  • 我确信即使没有id,也有足够的方法来选择您的表。显示此表的HTML
  • 表格的html是:
  • “我无法在 Xpath 函数中从中间开始。”,为什么?您是否尝试使用浏览器工具测试 XPath?

标签: java html xpath htmlunit


【解决方案1】:

您可以尝试使用其属性来识别您的表。试试下面XPath:

//table[@class="className"][@role="presentation"]

【讨论】:

  • 我试过了。不工作。第一个表有一个 id。那个 HTML 是 我使用了代码final HtmlTable table1 = (HtmlTable) page2.getElementById("tableID");即使这是给 NullPointerException。不知道为什么它不会按 id 选择表格。
  • 我会尝试添加。有两种类型的函数,getElementById 和 getHtmlElementById。第一个,我得到 NPE,而后一个,我得到 element not found 异常。我只是想看看如果它有 ID,我可以访问表。仍然不确定如何处理我感兴趣的原始表格
【解决方案2】:

我猜你有一个更普遍的问题。 作为第一次检查,您可以使用类似

System.out.println(page.asXml());

转储您的页面。这样做是为了了解您的页面是什么样的。一些更复杂的网页正在做一些客户端渲染(这意味着部分 dom 将在客户端从一些 javascript 代码构建)。在这种情况下,您必须等待 javascript 完成,然后才能开始通过 XPath 或 gettign 子节点尝试控件。

如果您确定 dom 树看起来像您期望的那样,您可以将复制的页面代码加载到 firefox 并使用 firebug。 Firebug 提供了一个函数来为选定的 dom 元素生成 XPath 表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多