我是Htmlunit的新手并试图从网站http://capitaline.com/new/index.asp中提取数据。我已成功登录该网站。当我们登录网站时有三个框架。
我设法得到了我需要的框架:
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" >
答案 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");