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



我有一个文档 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. 是否有已知的真实的方法在文档构建阶段分配节点?这样我就不会用text方法跳舞了?即,我如何在构建阶段分配doc.h1节点与a.at_css("#section#{n} h1")节点的值?

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

  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(...)方法的利润是多少?

    这与你问题的其余部分无关。如文档所述:

    使用现有的根对象创建构建器。当您有一个现有的文档,并且希望使用构建器方法进行扩展时,可以使用此方法。创建的构建器上下文将从给定的root节点开始。

一般来说,我发现在使用已知的层次结构从头编写大量自定义节点时,Builder非常方便。如果不这样做,您可能会发现创建一个新文档并使用DOM方法适当地添加节点会更简单。很难区分你的文档将有多少硬编码节点/层次结构,而不是程序创建的。

另一个可选的建议:也许您应该创建一个模板XML文档,然后使用来自另一个抓取的HTML的细节来扩展它?

相关内容

  • 没有找到相关文章

最新更新