0

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

我想用 XPath 解析它,但它无法找到一个<table ...>by,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,所以也许我遗漏了一些东西。

谁能让我直截了当?谢谢。

4

7 回答 7

2

我对 JTidy 一无所知,但对于 WATIJ,我相信您获得 NullPointer 和 UnknownObject 异常的原因是因为您的 XPATH 使用的是小写节点。因此,假设您使用“//table[@id='searchResult']”作为在 WATIJ 中查找表的 xpath。这实际上不起作用,因为“table”是小写的。对于 WATIJ,您需要将所有节点名称大写,例如:“//TABLE[@id='searchResult']”。例如,假设您想使用 WATIJ 打印该表的行数,您可以执行以下操作:

导入 watij.runtime.ie.IE;
导入静态 watij.finders.SymbolFactory.*;

公共类示例{
    公共静态无效主要(字符串[]参数){
        IE 即 = 新的 IE();
        ie.start("your_url_goes_here");
        System.out.println(ie.table(xpath, "//TABLE[@id='searchResult']").rowCount());
        即关闭();
    }
}

此代码或答案可能不正确,因为我今天才开始使用 WATIJ。尽管我确实遇到了与 xpaths 相同的问题。花了我几个小时的搜索/测试,我才注意到这个页面上的所有 xpath 是如何大小写的:WATIJ 用户指南一旦我在我的 xpath 中更改了大小写,WATIJ 就能够找到对象,所以这也应该适用于你.

于 2009-08-31T20:39:53.593 回答
0

我从未直接使用过 Java 的 XPath API,我总是通过dom4j或其他语言(Perl 和 C)使用它。但我对它如何正常工作有很好的理解。一开始您可能应该将输入解析为 DOM 文档,这将有很大帮助。此外,如果您知道您的文档具有 ID,您应该通过加载描述它的 DTD 或模式来解析它,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 中以这种方式声明时。

于 2009-05-18T04:54:04.327 回答
0

你的 xPath 是正确的......无论失败是什么,都不是。

于 2009-05-18T04:54:35.590 回答
0

看起来问题主要出在 JTidy 上。我可以通过执行以下操作让 xpath 解析 JTidy-ied 结果:

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

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

我将不得不查看其他 HTML -> XML 转换选项。我快速尝试了 Cobra,但它也无法通过 ID 找到我的表。我没有尝试手动清理 Cobra 的结果,所以我不知道它与 JTidy 相比如何。

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

于 2009-05-19T15:11:32.497 回答
0

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

于 2009-08-31T20:53:45.127 回答
0

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

于 2009-11-10T00:46:24.800 回答
0

Uniue ID 属性需要通过 id() 方法访问id('search')

于 2010-04-06T07:23:08.427 回答