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
方法,它将其输出包装在 <html>
和 <body>
标签中:
> 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
偶尔会做其他奇怪的事情,比如将片段包装在 <p>
中(例如,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('<p>a</p>').at('body').inner_html
。解决了我的问题,但它看起来很讨厌,不是吗?有没有办法告诉Nokogiri.HTML
我不希望它为我创建整个文档?即,我也不希望 Nokogiri.HTML('a
').children 包含正文标签 当然,我想知道DocumentFragment
,但我从未使用过它。我想我应该在打字之前查一下。 :-)
大约两年前,Aaron Peterson 教了我关于 DocumentFragment
的知识。从那时起,我只需要使用它几次。我更喜欢更通用的Nokogiri::HTML
,因为它可以呈现正确的文档,但有时使用 sn-p 是可以的。以上是关于Nokogiri 相当于 Hpricot 的 html 方法的主要内容,如果未能解决你的问题,请参考以下文章
简单的 Nokogiri 不起作用:“Nokogiri”的未定义方法调用
LoadError:库版本不兼容 - /home/ubuntu/.rvm/gems/ruby-2.3.1@lm5/gems/nokogiri-1.8.2/lib/nokogiri/nokogiri.s