我正在使用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就能够找到对象,因此这对您也同样适用。

10-08 11:45