现在,我使用Jsoup从某些第三方网页中提取某些信息(不是全部文本),我会定期进行此操作。在某些网页的HTML发生更改之前,此方法可以正常工作,此更改导致现有Java代码发生更改,这是一项繁琐的任务,因为这些网页更改非常频繁。另外,它需要程序员来修复Java代码。这是我在网页上感兴趣的HTML代码的示例:

<div>
<p><strong>Score:</strong>2.5/5</p>
<p><strong>Director:</strong> Bryan Singer</p>
</div>
<div>some other info which I dont need</div>
现在这是我想要做的,我想在本地保存此网页(一个HTML文件)并从中创建一个模板,例如:
<div>
<p><strong>Score:</strong>{MOVIE_RATING}</p>
<p><strong>Director:</strong>{MOVIE_DIRECTOR}</p>
</div>
<div>some other info which I dont need</div>
这些HTML模板与网页的实际URL一起将作为Java程序的输入,Java程序将查找这些预定义关键字的位置(例如 {MOVIE_RATING} {MOVIE_DIRECTOR} )并从实际的值中提取值网页。
这样,我不必在每次页面更改时都修改Java程序,只需保存网页的HTML并用这些关键字替换数据,其余的将由程序处理。例如,将来实际的HTML代码可能如下所示:
<div>
<div><b>Rating:</b>**1/2</div>
<div><i>Director:</i>Singer, Bryan</div>
</div>
相应的模板如下所示:
<div>
<div><b>Rating:</b>{MOVIE_RATING}</div>
<div><i>Director:</i>{MOVIE_DIRECTOR}</div>
</div>
还可以由非程序员(可以编辑文件的任何人)创建此类模板。
现在的问题是,我该如何用Java来实现这一目标,是否有任何现有的更好的方法来解决此问题?
注意:在谷歌搜索过程中,我发现了一些研究论文,但其中大多数都需要事先学习数据,准确性也值得关注。

最佳答案


  • 从通常的意义上来说,您描述的模板实际上不是"template":一组静态内容,该静态内容转储到输出中,其中插入了一堆动态内容。相反,它是模板的“反向”-它是一种分析模式,它被过滤并丢弃,从而留下了所需的参数。
  • 因为您的网页定期更改,所以您不想对要解析的内容进行硬编码,而是希望“放大”其基本功能,从而尽量减少假设。也就是说,您要 promise 从字面上匹配关键文本(例如“Rating:”),并以更加灵活的方式处理交错标记(例如"<b/>")-忽略它并允许其更改而不会中断。
  • 当组合(1)和(2)时,可以给结果指定任何您喜欢的名称,但是它使用正则表达式进行解析。即模板方法是使用正则表达式的解析方法-它们是相同的。问题是:正则表达式应采用什么形式?

    3A。如果使用Java手工编码进行解析,那么显而易见的答案是正则表达式格式应该只是java.util.regex格式。其他任何事情都是开发负担,是“非标准”的,将很难维护。

    3B。如果您要使用希望使用HTML感知的解析器,那么jsoup是一个很好的解决方案。问题是您需要比jsoup似乎提供更多的文本/正则表达式处理和灵活性。它似乎太锁定在特定的html标签和结构中,因此在页面更改时会中断。

    3C。您可以使用功能更强大的语法控制的常规文本解析器,例如ANTLR-一种形式的backus-naur启发式语法用于控制解析,并插入生成器代码以处理解析的数据。在这里,语法语法表达式确实非常强大,它具有复杂的规则,这些规则涉及页面上文本的排序方式以及文本字段和值如何相互关联。功能强大,超出了您的要求,因为您没有在处理语言。而且,您仍然需要描述要跳过的丑陋位(例如标记标签等),这是无可避免的事实。而第一次与ANTLR进行角力涉及在获得生产力返回之前的教育投资。

    3D是否有一个仅使用简单模板类型方法给出简单答案的Java工具?嗯,谷歌搜索不会给https://www.google.com/search?q=java+template+based+parser&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-GB:official&client=firefox-a太多希望。我相信,创建此类野兽的任何尝试都会退化为基本的正则表达式解析或更高级的语法控制解析,因为匹配/忽略/替换文本的基本要求将解决方案推向了这些方向。其他任何事情都太简单而无法实际工作。对不起,负面的看法-它只是反射(reflect)问题的空间。

  • 我的投票赞成(3A),它是满足您需求的最简单,最强大和最灵活的解决方案。

    07-28 03:40
    查看更多