在 Java 中使用 XPath 查询 HTML 页面
Posted
技术标签:
【中文标题】在 Java 中使用 XPath 查询 HTML 页面【英文标题】:Querying an HTML page with XPath in Java 【发布时间】:2011-03-22 02:57:17 【问题描述】:谁能告诉我一个 Java 库,它允许我在 html 页面上执行 XPath 查询?
我尝试使用 JAXP,但它一直给我一个我似乎无法修复的奇怪错误(线程“main”java.io.IOException:服务器返回 HTTP 响应代码:503 for URL:http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd)。
非常感谢。
编辑
我发现了这个:
// Create a new SAX Parser factory
SAXParserFactory factory = SAXParserFactory.newInstance();
// Turn on validation
factory.setValidating(true);
// Create a validating SAX parser instance
SAXParser parser = factory.newSAXParser();
// Create a new DOM Document Builder factory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// Turn on validation
factory.setValidating(true);
// Create a validating DOM parser
DocumentBuilder builder = factory.newDocumentBuilder();
来自http://www.ibm.com/developerworks/xml/library/x-jaxpval.html 但是将参数设置为 false 并没有改变任何东西。
【问题讨论】:
几个相关问题 - 见***.com/questions/9766776/…***.com/questions/3361263/…***.com/questions/9022140/… 【参考方案1】:看看这个:
http://www.w3.org/2005/06/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic
可能您将解析器设置为执行 DOM 验证,并且它正在尝试检索 DTD。 JAXP 应该有一种方法可以禁用 DTD 验证,只需针对假定有效的文档运行 XPATH。我已经很多年没有使用 JAXP,所以很抱歉我不能提供更多帮助。
【讨论】:
【参考方案2】:将解析器设置为“非验证”只会关闭验证;它确实不禁止获取DTD。获取 DTD 不仅用于验证,还用于实体扩展……据我所知。
如果你想禁止获取 DTD,你需要注册一个正确的 EntityResolver
到 DocumentBuilderFactory
或 DocumentBuilder
。实现EntityResolver
的resolveEntity
方法总是返回一个空字符串。
【讨论】:
以上是关于在 Java 中使用 XPath 查询 HTML 页面的主要内容,如果未能解决你的问题,请参考以下文章
Java XPath:使用默认命名空间 xmlns 进行查询