我有一个Java应用程序,它将解析html页面并从中提取数据。目前,我有一个类作为模板或如何阅读特定网页的说明。应用程序需要从几个不同的格式中读取不同的格式。我希望能够读取随附的XML文件(或其他文档),而不是为每种类型的格式创建新的模板类,该文件将提供有关哪些数据和提取位置的说明。
我试图在网上搜索如何做到这一点,但我猜我没有问正确的问题或使用正确的关键字。
解决方案不必使用XML作为模板,但这是我第一次想到的。
有人能指出我正确的方向吗?
答案 0 :(得分:2)
您可以保留xpath表达式,而不是在xml中使用模板,这些表达式会映射到您正在阅读的每个网站所需的数据。然后,当您正在更改的页面进行更改时,您可以更新该站点的xpath表达式。
答案 1 :(得分:0)
我之前实际上已经做过类似的事情,但它相当复杂。基本上我制作了一个插件系统(令人厌恶的像Maven),你可以参数化提取插件。
您可以使用Spring Bean XML作为DSL。
<bean id="strategy1" class="absolute.class.name">
</bean>
<bean id="extractorExecutor" class="class.to.extractorExecutor">
<property name="strategies">
<list>
<item ref="strategy1" />
<item ref="strategy2" />
</list>
</property>
</bean>
你的提取器基本上遍历了一堆实现如下界面的bean:
public interface ExtractStrategy {
/**
* null means skip this extractor and go to the next one.
*/
public Extracted extract(String data);
}
在您的提取器中,您可以:
for (ExtractorStrategy e : strategies) {
Extracted ex = e.extract(data);
if (ex != null) break;
}
Spring称之为解析器链模式,有些人称之为策略模式。
然后你可以制作像@digitaljoel所说的XPath提取器和/或Regex Extractor ......等等。 您按照您希望它们运行的顺序放置策略。
我在data-mining需要启发式的时候一直使用这种模式。为了提取令人讨厌的HTML(在其他人的评论中提到),我建议Jericho或JSoup(在这种情况下,你制定一个杰里科策略并添加到链中)。