【问题标题】:Parsing HTML content with sibling tags in Java (or) Finding content between two <open> tags在 Java 中使用兄弟标签解析 HTML 内容(或)在两个 <open> 标签之间查找内容
【发布时间】:2011-08-29 01:38:12
【问题描述】:

背景:我正在编写一个 Java 程序来遍历 HTML 文件并用 Lorem Ipsum 替换标签中不是&lt;script&gt;&lt;style&gt; 的所有内容。我最初使用正则表达式执行此操作,只是删除了 > 和尝试在 html 上使用正则表达式,让宇宙不再神圣。

我正在尝试使用 HtmlCleaner,这是一个吸引我的 Java 库,因为它没有其他依赖项。但是,尝试实现它我一直无法像这样处理 html:

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

问题很简单。当 TagNodeVisitor 到达 div 时,如果我用适量的lipsum 替换它的内容,它将消除span 标签。但是,如果我只深入到没有其他子节点的 TagNodes,我会错过第一段文本。

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

【问题讨论】:

  • 您是否使用过类似 StringTokenizer 的东西?只是在这里大声思考。
  • 我相信这只是一个简化的正则表达式,现在已弃用 - 来自 Java 文档“StringTokenizer 是一个遗留类,出于兼容性原因保留,尽管在新代码中不鼓励使用它。建议任何人使用 String 的 split 方法或 java.util.regex 包来寻求此功能。"正则表达式实际上对我来说工作得很好,但在 html 上使用正则表达式显然是一件糟糕的事情。

标签: java html parsing nested htmlcleaner


【解决方案1】:

你几乎可以用JSoup setters做任何你想做的事情

这适合你吗?

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

【讨论】:

  • 我不这么认为。我浏览了 jSoup 文档,但找不到任何可以替换打开标记和子元素的打开标记之间的文本的内容。 (尝试将您的示例代码应用于我的示例 html 不会保留内部跨度)。
  • 如果在跨度之后但在 div 内有文本的情况下,您的工具进行的转换会产生什么结果?
  • 我想让它把&lt;div&gt;text here &lt;span&gt;more text&lt;/span&gt; and here&lt;/div&gt; 吐出来&lt;div&gt;lorem ipsum &lt;span&gt;dolor sit&lt;/span&gt; amet nuncam&lt;/div&gt;。我想替换两个标签之间的任何文本,无论它们都是打开、关闭还是打开和关闭。
  • 你可以先得到最深的节点,然后再向上应用你想要的转换。所以在这种情况下,当一个节点没有子节点时,您可以替换它的完整 html 内容,如果当前节点有子节点,那么您可以使用 append()、prepend() 或 wrap()。它很快就会变得一团糟,所以我想我实际上错过了大局。
【解决方案2】:

HtmlCleaner 的 ContentNode 有一个方法 getContent(),它返回一个 java.lang.StringBuilder。这是可变的,可以更改为您想要的任何值。

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    相关资源
    最近更新 更多