【问题标题】:Selectively deactivate pretty-print in jsoup for certain regions in a document有选择地为文档中的某些区域停用 jsoup 中的漂亮打印
【发布时间】:2023-03-11 04:53:02
【问题描述】:

当使用 jsoup 清理 HTML 文档时,我喜欢它自动应用漂亮打印的事实。我知道我可以在每个文档的基础上停用它,但我喜欢将它应用于大多数文档,除了 jsoup 不能很好地工作的某些有问题的区域。

一个例子是带有CSS specifying white-space: pre-wrap;DIV 标签,即语义上它们的行为类似于PRE 标签,这意味着浏览器将对换行符和其他空格(缩进)敏感。如果在这些区域内有更多标签,例如BRSPAN 等,情况会变得更糟,因为应用了漂亮打印并破坏了这些区域的预期格式。

因此,与其完全停用整个 HTML 文档的漂亮打印,我喜欢在解析器遇到类似 div.listing 的内容时选择性地停用它(是的,我知道有问题区域的 CSS 类名称)并保留原始那里有 HTML。我将如何实施?

更新:我忘了提到我使用

打印清理过的文档
output.print(document);

其中outputPrintStreamdocument 是jsoup Document 实例。所以如果有更好的方法来输出文档,我也愿意提出建议。

【问题讨论】:

    标签: java jsoup pretty-print


    【解决方案1】:

    我最终做了什么,因为到目前为止我在这里没有得到任何答案,也没有找到更好的解决方案,这很可怕,但它确实有效:

    1. 解析 + 清理文档
    2. 获取(通过toString())+ 保留打印精美的 HTML 内容
    3. 停用漂亮打印,然后获取(通过toString())+ 重新解析原始格式的内容到临时文档中
    4. 重新解析第 2 步中漂亮打印的内容并分配给原始文档(覆盖它),然后为新分配的文档停用漂亮打印
    5. 替换漂亮打印会破坏格式的内容(例如带有 CSS white-space: pre-wrap 的元素),方法是保留步骤 2 中的原始内容,通过类似的方式并行迭代两个文档
    for (int i = 0; i < elementsToBeFixed.size(); i++) 
      elementsToBeFixed.get(i).replaceWith(originalElements.get(i));
    

    结论:这很难看,因为之前已经解析+清理过的同一个文档需要再解析两次,即我们总共有 3 次Jsoup.parse(..) 调用。但是 - 它有效。 :-/

    不过,我仍在等待更好的答案。

    【讨论】:

    • 好的,在 9 个月没有任何评论或替代答案之后,我接受了我自己的解决方法作为答案。我在邮件列表上的请求也没有得到答复。所以我不期待在功能方面有任何进展。 ?
    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2011-10-15
    • 2017-12-19
    • 1970-01-01
    相关资源
    最近更新 更多