使用另一个内容构建HTML文档

时间:2011-12-01 21:17:11

标签: ruby nokogiri

我有一个 A 的文档,想要使用 A 的节点值构建一个新的 B

鉴于 A 看起来像这样......

<html>
  <head></head>
  <body>
    <div id="section0">
      <h1>Section 0</h1>
      <div>
        <p>Some <b>important</b> info here</p>
        <div>Some unimportant info here</p>
      </div>
    <div>
    <div id="section1">
      <h1>Section 1</h1>
      <div>
        <p>Some <i>important</i> info here</p>
        <div>Some unimportant info here</div>
      </div>
    <div>
  </body>
</html>

在构建 B 文档时,我正在使用方法a.at_css("#section#{n} h1").text A h1标记中获取数据,如下所示:

require 'nokogiri'

a = Nokogiri::HTML(html)

Nokogiri::HTML::Builder.new do |doc|
  ...
  doc.h1 a.at_css("#section#{n} h1").text
  ...
end

所以有三个问题:

  1. 如何获取保留内部标签的<p>标签内容 <p>

    目前,我点击a.at_css("#section#{n} p").text后 返回一个纯文本,这不是我们需要的。

    如果我点击.text.to_html而不是.inner_html,则html会显示为已转义。例如,我得到&lt;p&gt;而不是<p>

  2. 在文档构建阶段是否有任何已知的 true 分配节点的方法?所以我根本不会用text方法跳舞?即如何在构建阶段为doc.h1节点分配a.at_css("#section#{n} h1")节点的值?

  3. Nokogiri::Builder.with(...)方法的利润是多少?我想知道我是否可以使用它......

1 个答案:

答案 0 :(得分:1)

  1. 如何获取保留<p>内标记的<p>代码的内容?

    使用.inner_html。访问实体时不会对其进行转义。如果您执行builder.node_name raw_html之类的操作, 将被转义。代替:

    require 'nokogiri'
    para = Nokogiri.HTML( '<p id="foo">Hello <b>World</b>!</p>' ).at('#foo')
    
    doc = Nokogiri::HTML::Builder.new do |d|
      d.body do
        d.div(id:'content') do
          d.parent << para.inner_html
        end
      end
    end
    
    puts doc.to_html
    #=> <body><div id="content">Hello <b>World</b>!</div></body>
    
  2. 在文档构建阶段是否有任何已知的分配节点的真实方法?

    与上述类似,一种方法是:

    puts Nokogiri::HTML::Builder.new{ |d| d.body{ d.parent << para } }.to_html
    #=> <body><p id="foo">Hello <b>World</b>!</p></body>
    

    瞧!节点已从一个文档移动到另一个文档。

  3. Nokogiri::Builder.with(...)方法的利润是多少?

    这与你提出的其他问题无关。正如the documentation所说:

      

    使用现有根对象创建构建器。当您拥有要使用构建器方法扩充的现有文档时,可以使用此选项。创建的构建器上下文将从给定的root节点开始。

    我不认为这对你有用。

  4. 通常,我发现使用已知层次结构从头开始编写大量自定义节点时,Builder很方便。如果不这样做,您可能会发现创建新文档并使用DOM方法根据需要添加节点更简单。很难说出你的文档与程序创建的硬编码节点/层次结构有多少。

    另一个替代建议:也许您应该创建一个模板XML文档,然后使用其他HTML格式的详细信息来扩充它?