getByXpath()在框架内不起作用

时间:2014-07-30 07:09:56

标签: java xpath frame htmlunit

我是Htmlunit的新手并试图从网站http://capitaline.com/new/index.asp中提取数据。我已成功登录该网站。当我们登录网站时有三个框架。

  1. 一个在顶部搜索我们正在提取数据的公司(如ACC公司)。
  2. 第二帧有一棵树,它提供了我们想要查看的各种数据的链接。
  3. 第3帧根据您在框架中单击的链接生成结果数据结果。
  4. 我设法得到了我需要的框架:

    HtmlPage companyAtGlanceTopWindow =(HtmlPage)companyAtGlanceLink.click().getEnclosingWindow().getTopWindow().getEnclosedPage();
    HtmlPage companyAtGlanceFrame = (HtmlPage)companyAtGlanceTopWindow.getFrameByName("mid2").getEnclosedPage();
    System.out.println(companyAtGlanceFrame.toString()); // This line returns the frame URL as i can see in my browser. 
    

    print语句的输出是

    HtmlPage(http://capitaline.com/user/companyatglance.asp?id=CGO&cocode=6)@1194282974
    

    现在我希望我的代码向下导航到此框架内的表格,为此我使用的是getByXPath(),但它给了我nullPointerException。这是代码。

    HtmlTable companyGlanceTable1 = companyAtGlanceFrame.getFirstByXPath("/html/body/table[4]/tbody/tr/td/table/tbody/tr/td[1]/table");
    

    我试图提取表格的当前网页的XPath(我点击链接后)似乎是正确的,因为它是从chrome element inspect复制的。请提出一些提取表格的方法。我以前做过这种类型的提取,但是我有表的id,所以,我用它 这是网页中表格的HTML代码。

    <table width="100%" class = "tablelines" border = "0" >
    

2 个答案:

答案 0 :(得分:0)

我想知道你能在控制台中看到每个iframe的内部内容(print asXml()),它们是嵌套的iframe吗? 好试试这个

   List<WebWindow> windows = webClient.getWebWindows();
   for(WebWindow w : windows){
     HtmlPage hpage = (HtmlPage) w.getEnclosedPage();
     System.out.println(hpage.asXml());
   }

一旦你看到了内容,

   HtmlPage hpage = (HtmlPage)webClient.getWebWindowByName(some_name).getEnclosedPage();

然后使用xpath抓取你的表内容(确保你的xpath是正确的)。它会起作用。(为我工作)

答案 1 :(得分:0)

感谢RDD的反馈意见。 我解决了这个问题。实际上问题不是框架,而是由chrome提供的XPath。 由chrome提供的XPath是:

/html/body/**table[4]**/tbody/tr/td/table/tbody/tr/td[1]/table

但XPath对我有用:

 /html/body/**table[3]**/tbody/tr/td/table/tbody/tr/td[1]/table

看起来,当路径中有一个表时,chrome提供的XPath有一些小问题(或者可能是htmlunit本身的一些错误)。我做了很多实验,发现chrome总是给../../table[row+1]/..作为XPath,而为htmlunit工作的XPath是../../table[row]/..

所以,这段代码对我来说很好用

HtmlTable companyGlanceTable1 = companyAtGlanceFrame.getFirstByXPath("/html/body/table[3]/tbody/tr/td/table/tbody/tr/td[1]/table");