JSoup的替代方案或如何清除空格

4

有人知道JSoup的替代方法吗?

还是如何清除类似于<p>&nbsp;</p>这样的序列?

jQuery的HTML Clean插件对我很有效,但我想在服务器端而不是在客户端进行html代码清理。

或者说,怎么用replaceAll表达式实现?:

String cleanS = dirtyS.replaceAll("<p>&nbsp;</p>", ""); //This doesnt work

我发现脏的html代码中包含混合使用的空格序列#160,以及其他的例如#32。因此,我需要一个表达式来删除任何混合的空格序列。

mix space blank


你想得到什么结果?是整段删除还是使用<p></p>标签? - user890904
我想要清除整个段落。 - JLLMNCHR
如果您上传文件并让我们下载,那么检查它并提供可用的代码就会更容易些。 - user890904
2个回答

8
您可以更改此输出设置:OutputSettings示例:
final String html = ...;


OutputSettings settings = new OutputSettings();
settings.escapeMode(Entities.EscapeMode.xhtml);

String cleanHtml = Jsoup.clean(html, "", Whitelist.relaxed(), settings);

这也可以通过Jsoup解析的文档实现:
Document doc = Jsoup.parse(...);
doc.outputSettings().escapeMode(Entities.EscapeMode.xhtml);

// ...

编辑:

删除标签:

doc.select("p:matchesOwn((?is) )").remove();

请注意:在(?is)之后没有空格,但是有字符#160(= nbsp)。 这将删除所有仅包含&nbsp;的文本的p标签。如果您想对所有其他标记执行此操作,则可以用*:替换p:

<p> </p> 返回 <p> </p>;但我想要移除整行 <p> </p>。 - JLLMNCHR
1
就像你所说的,使用 codedoc.select("p:matchesOwn((?is)\u00a0").remove();code 可以删除 code<p> </p>code,但是如何删除 code<p>    ...等等...</p>code 呢? - JLLMNCHR
1
如果上面的代码无法删除多个 &nbsp;,您可以使用以下正则表达式:"p:matchesOwn((?is) +?)" - ollo
嗨,我发现脏的HTML中混杂着#160和#32空白字符。你知道消除它们的主表达式吗?谢谢谢谢谢谢... - JLLMNCHR
糟糕!如上所述,Jsoup不支持发布的正则表达式,否则就不会有问题了。也许HtmlCleaner也是一个选择。但如果jQuery插件能够胜任...完美! :-) - ollo
显示剩余5条评论

1
如果您拥有文档对象,可以循环遍历段落元素并删除其中没有文本(或非空格文本)的所有元素。在检查文本是否为空之前,您可以将NBSP;的出现替换为空格。假设您正在使用UTF-8文档,以下代码可能适用于您:
public static final String NBSP_IN_UTF8 = "\u00a0"; 

假设您知道如何获取文档对象,清理的循环就很简单:选择段落元素并删除空元素。
org.jsoup.nodes.Document doc= ...   //obtain your document object  
for (org.jsoup.nodes.Element element : doc.select("p")) {
    if ( !element.hasText() || element.text().replaceAll(NBSP_IN_UTF8, "").trim().equals("") ) {
       element.remove();
    }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接