如何使用 Nokogiri 插入具有适当缩进的 HTML 块?

Posted

技术标签:

【中文标题】如何使用 Nokogiri 插入具有适当缩进的 HTML 块?【英文标题】:How to use Nokogiri to insert a block of HTML with proper indentation? 【发布时间】:2021-12-07 19:46:12 【问题描述】:

我有一块 html 想要插入到 Nokogiri 中的 HTML 文档中。问题是在 HTML 中的任何位置插入块时,它不会缩进插入的位置。这是一个例子:

HTML 文档(例如缩写):

<div>
  <div id="insertHere">
  </div>
</div>

要插入的 HTML:

<table>
  <tbody>
    <tr>
      <td>Hi</td>
    </tr>
  </tbody>
</table>

插入后的结果。发生这种情况是因为它没有考虑缩进。我希望能够考虑插入它的缩进,并用该缩进填充正在插入的每一行的左侧:

<div>
  <table>
  <tbody>
    <tr>
      <td>Hi</td>
    </tr>
  </tbody>
</table>
</div>

它是使用 Nokogiri 的 node.replace('&lt;table&gt;....&lt;/table&gt;') 插入的。

我希望它看起来像什么:

<div>
  <table>
    <tbody>
      <tr>
        <td>Hi</td>
      </tr>
    </tbody>
  </table>
</div>

有没有办法让我插入或替换的块的缩进左侧?

编辑:如果不使用 Nokogiri,这是我可以完成此任务的另一种方式吗?也许在每个元素上设置一个唯一的 ID,就像在 react 元素上设置的 data-react-id 一样,然后一旦我有一个需要插入元素的地方,我就可以使用正则表达式找到它并匹配左侧的空格缩进?对 Nokogiri 以外的其他方法开放。尝试集思广益其他选择。

我知道 Nokogiri 不能“漂亮打印”,但有没有办法让空格“向左或”或“当前元素之前和换行之后”的空格来计算缩进,然后我可以填充什么被手动插入。也许在 nokogiri 中有一种方法可以获取节点的父节点,然后一些如何使用父节点的内容来获取当前节点左侧的空白。

【问题讨论】:

我不认为 N​​okogiri 用于 HTML 代码的漂亮打印和缩进。你可以看看这里,看看这是否有帮助:***.com/questions/1898829/… @Casper 感谢您的链接。刚刚在底部添加了一个编辑。在 nokogiri 之外寻找其他选择来实现这一点。但如果我能弄清楚如何计算缩进,我就可以“手动”漂亮地打印出我的需要。 或者对漂亮的打印/格式化和html文档的方法有什么建议? 【参考方案1】:

事实证明 Nokogiri 并不像@Casper 提到的那样用于漂亮的打印。相反,我只是通过我使用 https://github.com/threedaymonk/htmlbeautifier gem 的 html 漂亮打印机运行它。

【讨论】:

以上是关于如何使用 Nokogiri 插入具有适当缩进的 HTML 块?的主要内容,如果未能解决你的问题,请参考以下文章

使用 org-indent-mode 时如何用适当的缩进包装列表?

创建“Nokogiri::XML”或“Nokogiri::HTML”对象时如何避免创建无意义的空白文本节点

如何使用nokogiri找到具有共同最近祖先的相同深度的所有链接

使用 Nokogiri xpath 解析时未插入 Ruby 环境变量

如何使用 Nokogiri 访问属性

如何使用 Nokogiri 获取没有任何文本内容的完整 HTML