Nokogiri 相当于 Hpricot 的 html 方法

Posted

技术标签:

【中文标题】Nokogiri 相当于 Hpricot 的 html 方法【英文标题】:Nokogiri equivalent of Hpricot's html method 【发布时间】: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>"

【问题讨论】:

【参考方案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 是可以的。

以上是关于Nokogiri 相当于 Hpricot 的 html 方法的主要内容,如果未能解决你的问题,请参考以下文章

ruby 1.9:UTF-8 中的无效字节序列

通过Gem(HPricot)安装

hpricot xpath字符串来获取网站的favicon

简单的 Nokogiri 不起作用:“Nokogiri”的未定义方法调用

LoadError:库版本不兼容 - /home/ubuntu/.rvm/gems/ruby-2.3.1@lm5/gems/nokogiri-1.8.2/lib/nokogiri/nokogiri.s

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