java - 基于 XPATH 的 html 页面内容提取

标签 java sax xpath

我正在尝试根据给定的 xpath 提取内容。当我只想提取一个元素时,没有问题。当我有一个与该 xpath 匹配的项目列表时,我会得到节点列表,并且可以提取值。

但是,有几个彼此相关的项目形成一个组,并且该组会重复自身。

我可以做的一种方法是获取所有此类组的父节点的节点列表,然后应用基于 SAX 的解析技术来提取信息。但这会引入特定于模式的编码。我想让它变得通用。 例如。

<html><body>
<!--... a lot divs and other tags ... -->
<div class="divclass">
<item>
     <item_name>blah1</item_name>
     <item_qty>1</item_qty>
     <item_price>100</item_price>
</item>
</div>
<div class="divclass">
<item>
     <item_name>blah2</item_name>
     <item_qty>2</item_qty>
     <item_price>200</item_price>
</item>
</div>
<div class="divclass">
<item>
     <item_name>blah3</item_name>
     <item_qty>3</item_qty>
     <item_price>300</item_price>
</item>
</div>
</body></html>

我可以轻松地为这个 xml 编写代码,但不能编写可以解析任何给定规范的通用代码。

我应该能够从上面创建attribute-valuemap列表

有人试过这个吗?

编辑 输入 xpath 列表:

1. "html:div[@class='divclass']/item/item_name"
2. "html:div[@class='divclass']/item/item_qty"
3. "html:div[@class='divclass']/item/item_price"

简单文本的预期输出:

 item_name:blah1;item_qty:1;item_price:100
 item_name:blah2;item_qty:2;item_price:200
 item_name:blah3;item_qty:3;item_price:300

这里的关键点是,如果我单独应用每个 xpath,它将垂直获取结果,即第一个将获取所有 item_names,第二个将获取所有 qtys。所以我会放弃这些片段中的相互关系。

希望这能满足我的要求。

谢谢 奈恩

最佳答案

我不确定我是否收到了您的问题,但听起来您想在 HTML 文档上使用 XPath。

要使用 XPath,所编写的 HTML 文档需要格式良好。 Java 有多种 HTML 解析器; this article比较其中 4 个。

HtmlCleaner似乎提供了你所追求的。它允许在“清理后的”HTML 文档上执行 XPath 的子集。显然它不支持完整的 XPath 表达式,请参阅 the documentation .

如果您需要比 HtmlCleaner 支持的更复杂的 XPath 表达式,您可能需要使用 javax.xml.xpath包含格式良好的 XHTML 文档的包。 JTidy可以将 HTML 文档转换为 XHTML 文档。

我希望这能回答您的问题。

关于java - 基于 XPATH 的 html 页面内容提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3363661/

相关文章:

html - 使用CSS选择器从流解析器(例如SAX流)收集HTML元素

android - 我可以使用 SAX 解析器解析二进制 XML 文件(在 res/xml 中)吗

xpath - XSL Pattern 和 XPath 在语法上有什么区别?

java - 我可以将源文件夹从 Eclipse 导入 Flash Builder 吗?

java - 如何重新提示无效 boolean 输入(java)

java - 用 SAX 解析 XML |如何处理特殊字符?

html - Xpath 和 innerHTML

xml - 如何使用 Xpath 查找具有属性且不带另一个属性的元素

java - Maven/导入基础知识 - 找不到类

java - 什么时候需要调用这个方法 Runtime.getRuntime().addShutdownHook()