2011-08-29 33 views
0

背景:我正在编写一个Java程序来浏览HTML文件,并将非<script><style>标签中的所有内容替换为Lorem Ipsum 。我原本是用一个正则表达式去除一个>和一个<之间的一切,这实际上工作得很好(我知道是亵渎神灵),但我试图把它变成其他人可能会觉得有用的工具,所以我不敢威胁通过尝试在HTML上使用正则表达式,宇宙的神圣性。使用Java中的兄弟标签解析HTML内容(或)在两个<open>标签之间查找内容

我想使用HtmlCleaner,一个吸引我的Java库,因为它没有其他的依赖关系。然而,试图实现它,我一直无法处理这样的HTML:

<div> 
    This text is in the div <span>but this is also in a span.</span> 
</div> 

问题很简单。当TagNodeVisitor达到div时,如果我用适量lipum替换它的内容,它将消除span标签。但是如果我深入了解没有其他孩子的TagNode,我会错过第一个文本。

HtmlCleaner有一个ContentNode对象,但该对象没有替换方法。任何我能想到的处理这件事似乎都是太复杂了。是否有人熟悉处理这个问题的方法,使用HtmlCleaner或其他更熟悉的解析库?

+0

你看过使用类似StringTokenizer的东西吗?只是在这里大声思考。 – Preston

+0

我认为这只是一个简化的正则表达式,现在已被弃用 - 来自Java文档“StringTokenizer是一个遗留类,为了兼容性的原因,尽管在新代码中不鼓励使用它,建议任何寻求该功能的人都使用拆分方法改为String或java.util.regex包。“正则表达式实际上为我工作得体,但在html上使用正则表达式显然是一件可怕的事情。 – NealJMD

回答

0

你几乎可以做你想要JSoup setters

但愿适合你什么吗?

Element div = doc.select("div").first(); // <div></div> 
div.html("<p>lorem ipsum</p>"); // <div><p>lorem ipsum</p></div> 
+0

我不这么认为。我绕过jSoup文档,但找不到任何可以替换打开标记和子元素的打开标记之间的文本的东西。 (试图将您的示例代码应用于我的示例html不会保留内部跨度)。 – NealJMD

+0

什么是你的工具所做的转换的结果,那么在跨度之后但div内部有文本的情况下呢? –

+0

我希望它采取'

text here more text and here
'并且吐出'
lorem ipsum dolor sit amet nuncam
'。我想要替换两个标签之间的任何文本,无论它们是打开的,关闭的还是打开关闭的。 – NealJMD

相关问题