我正在使用WATIJ进行一些屏幕抓取,但是它无法读取HTML表(引发NullPointerExceptions或UnknownObjectExceptions)。为了克服这个问题,我阅读了HTML并通过JTidy运行它以获得格式正确的XML。
我想用XPath解析它,但是即使表在XML普通表中存在,它也无法通过<table ...>
找到id
。这是我的代码:
XPathFactory factory=XPathFactory.newInstance();
XPath xPath=factory.newXPath();
InputSource inputSource = new InputSource(new StringReader(tidyHtml));
XPathExpression xPathExpression=xPath.compile("//table[@id='searchResult']");
String expression = "//table[@id='searchResult']";
String table = xPath.evaluate(expression, inputSource);
System.out.println("table = " + table);
该表是一个空字符串。
该表位于XML中。如果我打印
tidyHtml
字符串,它将显示 <table
class="ApptableDisplayTag"
id="searchResult"
style="WIDTH: 99%">
我以前没有使用过XPath,所以也许我错过了一些东西。
谁能让我挺直?谢谢。
最佳答案
我对JTidy一无所知,但是对于WATIJ,我相信您收到NullPointer和UnknownObject异常的原因是因为您的XPATH使用小写的节点。因此,假设您使用“ // table [@ id ='searchResult']”作为xpath在WATIJ中查找表。这实际上是行不通的,因为“表”是小写的。对于WATIJ,您需要将所有节点名称都大写,例如:“ // TABLE [@ id ='searchResult']”。例如,假设您要使用WATIJ打印该表的行数,请执行以下操作:
导入watij.runtime.ie.IE;
导入静态watij.finders.SymbolFactory。*;
公共类示例{
公共静态void main(String [] args){
IE即=新IE();
ie.start(“ your_url_goes_here”);
System.out.println(即table(xpath,“ // TABLE [@ id ='searchResult']”)。rowCount());
ie.close();
}
}
由于我今天才开始使用WATIJ,因此此代码或答案可能不正确。虽然我确实遇到了与xpaths相同的确切问题。我花了几个小时进行搜索/测试,然后才注意到此页面上所有xpath的大小写:WATIJ User Guide一旦更改了xpath中的大小写,WATIJ就能够找到对象,因此这对您也同样适用。