在 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,你需要注册一个正确的 EntityResolverDocumentBuilderFactoryDocumentBuilder。实现EntityResolverresolveEntity 方法总是返回一个空字符串。

【讨论】:

以上是关于在 Java 中使用 XPath 查询 HTML 页面的主要内容,如果未能解决你的问题,请参考以下文章

Java XPath:使用默认命名空间 xmlns 进行查询

这是获取此 HTML 字符串中唯一的 MP3 href 的正确 xpath 查询语句吗?

解析 html -> xml 并使用 Xpath 进行查询

用于解析 html 标签的 xpath 查询

XPath

Java XPath:获取与查询匹配的所有元素