【问题标题】:Nokogiri equivalent of Hpricot's html methodNokogiri 相当于 Hpricot 的 html 方法
【发布时间】:2011-01-30 04:00:44
【问题描述】:

Hpricot 的 html 方法只输出文档中的 HTML:

> Hpricot('<p>a</p>').html
=> "<p>a</p>"

相比之下,我能与 Nokogiri 最接近的是 inner_html 方法,它将其输出包装在 &lt;html&gt;&lt;body&gt; 标签中:

> Nokogiri.HTML('<p>a</p>').inner_html
=> "<html><body><p>a</p></body></html>"

如何使用 Nokogiri 获得 Hpricot 的 html 方法的行为?即,我想要这个:

> Nokogiri.HTML('<p>a</p>').some_method_i_dont_know_about
=> "<p>a</p>"

【问题讨论】:

    标签: ruby nokogiri hpricot


    【解决方案1】:

    怎么样:

    require 'nokogiri'
    
    puts Nokogiri.HTML('<p>a</p>').to_html #
    # >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
    # >> <html><body><p>a</p></body></html>
    

    如果您不希望 Nokogiri 创建 HTML 文档,则可以告诉它将其解析为文档片段:

    puts Nokogiri::HTML::DocumentFragment.parse('<p>a</p>').to_html
    # >> <p>a</p>
    

    在任何一种情况下,to_html 方法都会返回文档的 HTML 版本。

    【讨论】:

    • 也许你的评论是过激的?
    • 是的,对不起。这看起来是最好的解决方案。 Nokogiri.HTML 偶尔会做其他奇怪的事情,比如将片段包装在 &lt;p&gt; 中(例如,Nokogiri::HTML("a\nb").inner_html),所以最好完全避免它。 Nokogiri::HTML::DocumentFragment 是否等同于 Hpricot 方法?
    • "Nokogiri::HTML::DocumentFragment 是否等同于 Hpricot 方法?"如果您希望 Nokogiri 仅返回一个片段。 Nokogiri 试图通过为您提供有效的 HTML 来帮助您,这就是 Nokogiri::HTML(...) 将返回的内容。
    【解决方案2】:
    > Nokogiri.HTML('<p>a</p>').xpath('/html/body').inner_html
    => "<p>a</p>"
    

    【讨论】:

    • 其 CSS 等价物是 Nokogiri.HTML('&lt;p&gt;a&lt;/p&gt;').at('body').inner_html。解决了我的问题,但它看起来很讨厌,不是吗?有没有办法告诉Nokogiri.HTML 我不希望它为我创建整个文档?即,我也不希望 Nokogiri.HTML('

      a

      ').children 包含正文标签
    • 当然,我想知道DocumentFragment,但我从未使用过它。我想我应该在打字之前查一下。 :-)
    • 大约两年前,Aaron Peterson 教了我关于 DocumentFragment 的知识。从那时起,我只需要使用它几次。我更喜欢更通用的Nokogiri::HTML,因为它可以呈现正确的文档,但有时使用 sn-p 是可以的。
    猜你喜欢
    • 2011-02-22
    • 2011-10-11
    • 1970-01-01
    • 2011-08-08
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2010-12-12
    相关资源
    最近更新 更多