Java XPath可以';无法按id查找表
我正在使用WATIJ进行一些屏幕抓取,但它无法读取HTML表(抛出NullPointerException或UnknownObjectException)。为了克服这个问题,我阅读了HTML并通过JTidy运行它以获得格式良好的XML 我想用XPath解析它,但它找不到Java XPath可以';无法按id查找表,java,xpath,watij,Java,Xpath,Watij,我正在使用WATIJ进行一些屏幕抓取,但它无法读取HTML表(抛出NullPointerException或UnknownObjectException)。为了克服这个问题,我阅读了HTML并通过JTidy运行它以获得格式良好的XML 我想用XPath解析它,但它找不到byid的,即使该表在XML平原中也是如此。这是我的密码: XPathFactory factory=XPathFactory.newInstance(); XPath xPath=factory.newXPath();
byid
的
,即使该表在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,所以可能我遗漏了一些东西
有人能帮我澄清一下吗?谢谢。我从未直接使用过Java的XPathAPI,我总是通过其他语言(Perl和C)使用它。但我很了解它是如何正常工作的。首先,您可能应该将输入解析为DOM文档,这将非常有帮助。另外,如果您知道您的文档具有ID,那么您应该通过加载DTD或模式来解析它,以这种方式描述文档,XML解析器将标记并标识具有适当ID的节点。完成此操作后,可以将代码与DOM树一起使用 [XPath.evaluate(expression,item)](显示第二个元素应该是一个节点或节点列表。这可能就是为什么会有大量的UnknowNobjectException 如果XML解析器能够识别ID元素,则可以使用以下XPath表达式访问具有ID的元素:
XPathExpression xPathExpression=xPath.compile("id('searchResult')");
xPathExpression.evaluate(document); // document is a DOM document instance
使用XPath函数是访问元素最有效的方法,也就是当元素使用ID并且在DTD或模式中以这种方式声明时。您的XPath是正确的……不管失败的是什么,都不是。看起来问题主要出在JTidy上。我可以使用XPath解析JTidy ied通过执行以下操作获得结果: 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(); } } 删除所有“nbsp;”。JTidy返回标记外带有“nbsp;”的xhtml。 移除 在标记中删除xmlns=…属性 移除“头部”标签。 (我使用了一些有趣的格式,因为正确键入时不会显示HTML实体)
JTyy也在文本内容的中间放置换行符,如果……元素,
我必须看看其他HTML->XML转换选项。我给了Cobra一个快速的尝试,但它也无法通过Id找到我的表。我没有尝试手动清理Cobra的结果,所以我不知道它与JTidy相比如何如果您知道一个返回良好XML的HTML解析器,请告诉我。我对JTidy一无所知,但对于WATIJ来说,我认为您获得NullPointer和UnknownObject异常的原因是因为您的XPATH使用小写节点。因此,假设您使用的是“//table[@id='searchResult']”作为在WATIJ中查找表的xpath。这实际上不起作用,因为“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.runtime.ie.ie; 导入静态watij.finders.SymbolFactory.*; 公开课范例{ 公共静态void main(字符串[]args){ IE=新IE(); 即开始(“你的url在这里”); System.out.println(ie.table(xpath,//table[@id='searchResult'])).rowCount(); 即关闭(); } }
这段代码或答案可能不正确,因为我今天才开始使用WATIJ。尽管我在XPath上遇到了同样的问题。我花了几个小时的搜索/测试才注意到所有XPath都是如何在这一页上显示的:一旦我在XPath中更改了大小写,WATIJ就能够找到对象,所以这应该可以在或者你也可以。解决方案是放弃WATIJ并切换到Google WebDriver。WebDriver记录了不同浏览器如何在xpath语句中处理大小写。绝对不需要双引号,大写也不需要。名称空间和/或DTD更可能是答案。Uniue ID属性需要通过ID()方法
id('search')
观察良好。Google WebDriver文档提到xpath语句的大小写敏感度取决于您使用的浏览器。