XPath无法通过id找到表

时间:2009-05-18 04:21:02

标签: java xpath watij

我正在使用WATIJ进行一些屏幕抓取,但它无法读取HTML表格(抛出NullPointerExceptions或UnknownObjectExceptions)。为了解决这个问题,我阅读了HTML并通过JTidy运行它以获得格式良好的XML。

我想用XPath解析它,但它找不到<table ...> id,即使表格在XML格式中也是如此。这是我的代码:

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,所以也许我错过了什么。

有人能让我直截了当吗?感谢。

7 个答案:

答案 0 :(得分:2)

我对JTidy一无所知,但是对于WATIJ,我相信你得到NullPointer和UnknownObject Exceptions的原因是因为你的XPATH正在使用较低的套接字节点。所以说你使用“// table [@ id ='searchResult']”作为xpath来查找WATIJ中的表。这实际上不会起作用,因为“table”是小写的。对于WATIJ,您需要以大写形式包含所有节点名称,例如:“// TABLE [@ id ='searchResult']”。例如,假设您要使用WATIJ打印该表的行数,您将执行以下操作:

import watij.runtime.ie.IE;
import static watij.finders.SymbolFactory.*;

public class Example {
    public static void main(String[] args) {
        IE ie = new IE();
        ie.start("your_url_goes_here");
        System.out.println(ie.table(xpath, "//TABLE[@id='searchResult']").rowCount());
        ie.close();
    }
}

这段代码或答案可能不对,因为我今天才开始使用WATIJ。虽然我确实遇到了与xpaths相同的问题。在我注意到这个页面上的所有xpath被如何填充之前,我花了几个小时的搜索/测试:WATIJ User Guide一旦我在xpaths中更改了外壳,WATIJ就能够找到对象,这样这对你来说很有用同样。

答案 1 :(得分:0)

我从未直接使用Java的XPath API,我总是通过dom4j或其他语言(Perl和C)使用它。但我对它如何正常工作有很好的理解。首先,您应该将输入解析为DOM文档,这将非常有用。此外,如果您知道您的文档具有ID,则应通过加载描述它的DTD或Schema来解析它,这样XML解析器将标记并标识具有适当ID的节点。完成此操作后,您可以将代码用于DOM树。

[XPath.evaluate(expression,item)](http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/xpath/XPath.html#evaluate(java.lang.String,%20java.lang.Object)的文档显示第二个元素应该是Node或NodeList。这可能就是为什么你有大量的UnknownObjectExceptions。

如果您的XML解析器能够识别ID元素,那么您可以访问具有以下XPath表达式的ID的元素:

XPathExpression xPathExpression=xPath.compile("id('searchResult')");
xPathExpression.evaluate(document); // document is a DOM document instance

使用XPath函数id()是访问元素的最有效方法,即元素使用ID并在DTD或Schema中以这种方式声明。

答案 2 :(得分:0)

你的xPath是正确的......不管它失败了,不是那样。

答案 3 :(得分:0)

看起来问题主要是JTidy。我可以通过执行以下操作来获取xpath来解析JTidy-ied结果:

删除所有“&lt;&amp; amp&gt; nbsp;”。 JTidy用“&lt;&amp; amp&gt; nbsp;”返回xhtml标签之外。    除掉    在标记中删除xmlns = ...属性    删除“head”标签。    (我使用了一些有趣的格式,因为HTML实体在正确键入时不会显示)

如果......元素,JTidy还会在文本内容的中间添加换行符。

我必须查看其他HTML - &gt; XML转换选项。我给了眼镜蛇一个快速的尝试,但它也没能找到我的表。我没有尝试手动清理Cobra的结果,所以我不知道它与JTidy的比较。

如果您知道返回优质XML的HTML解析器,请告诉我。

答案 4 :(得分:0)

解决方案是放弃WATIJ并切换到Google WebDriver。 WebDriver记录了不同的浏览器如何在xpath语句中处理大小写。

答案 5 :(得分:0)

绝对不需要双引号,也不是大写。名称空间和/或DTD更可能是答案。

答案 6 :(得分:0)

id()方法id('search')

需要访问唯一ID属性