如何让 Nokogiri inner_HTML 对象成为 ignore/remove 转义序列
How to get Nokogiri inner_HTML object to ignore/remove escape sequences
目前,我正在尝试使用 nokogiri 获取页面上元素的内部 HTML。但是,我不仅获取了元素的文本,还获取了它的转义序列。有没有办法用 nokogiri 抑制或删除它们?
require 'nokogiri'
require 'open-uri'
page = Nokogiri::HTML(open("http://the.page.url.com"))
page.at_css("td[custom-attribute='foo']").parent.css('td').css('a').inner_html
这个returns=>"\r\n\t\t\t\t\t\t\t\tTheActuallyInnerContentThatIWant\r\n\t"
最有效、最直接的 nokogiri(或 ruby)方法是什么?
page.at_css("td[custom-attribute='foo']")
.parent
.css('td')
.css('a')
.text # since you need a text, not inner_html
.strip # this will strip a result
旁注:css('td a')
可能比 css('td').css('a')
.
更有效
深入到包含所需文本的最近节点很重要。考虑一下:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
</body>
</html>
EOT
doc.at('body').inner_html # => "\n <p>foo</p>\n "
doc.at('body').text # => "\n foo\n "
doc.at('p').inner_html # => "foo"
doc.at('p').text # => "foo"
at
、at_css
和 at_xpath
return 一个 Node/XML:: 元素。 search
、css
和 xpath
return 一个节点集。查看 Node 或 NodeSet 时 text
或 inner_html
return 信息的方式存在很大差异:
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
<p>bar</p>
</body>
</html>
EOT
doc.at('p') # => #<Nokogiri::XML::Element:0x3fd635cf36f4 name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf3514 "foo">]>
doc.search('p') # => [#<Nokogiri::XML::Element:0x3fd635cf36f4 name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf3514 "foo">]>, #<Nokogiri::XML::Element:0x3fd635cf32bc name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf30dc "bar">]>]
doc.at('p').class # => Nokogiri::XML::Element
doc.search('p').class # => Nokogiri::XML::NodeSet
doc.at('p').text # => "foo"
doc.search('p').text # => "foobar"
请注意,使用 search
returned 一个 NodeSet 并且 text
returned 将节点的文本连接在一起。这很少是您想要的。
另请注意,Nokogiri 足够聪明,可以在 99% 的情况下判断选择器是 CSS 还是 XPath,因此对这两种类型都使用通用的 search
和 at
的选择器非常方便。
目前,我正在尝试使用 nokogiri 获取页面上元素的内部 HTML。但是,我不仅获取了元素的文本,还获取了它的转义序列。有没有办法用 nokogiri 抑制或删除它们?
require 'nokogiri'
require 'open-uri'
page = Nokogiri::HTML(open("http://the.page.url.com"))
page.at_css("td[custom-attribute='foo']").parent.css('td').css('a').inner_html
这个returns=>"\r\n\t\t\t\t\t\t\t\tTheActuallyInnerContentThatIWant\r\n\t"
最有效、最直接的 nokogiri(或 ruby)方法是什么?
page.at_css("td[custom-attribute='foo']")
.parent
.css('td')
.css('a')
.text # since you need a text, not inner_html
.strip # this will strip a result
旁注:css('td a')
可能比 css('td').css('a')
.
深入到包含所需文本的最近节点很重要。考虑一下:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
</body>
</html>
EOT
doc.at('body').inner_html # => "\n <p>foo</p>\n "
doc.at('body').text # => "\n foo\n "
doc.at('p').inner_html # => "foo"
doc.at('p').text # => "foo"
at
、at_css
和 at_xpath
return 一个 Node/XML:: 元素。 search
、css
和 xpath
return 一个节点集。查看 Node 或 NodeSet 时 text
或 inner_html
return 信息的方式存在很大差异:
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
<p>bar</p>
</body>
</html>
EOT
doc.at('p') # => #<Nokogiri::XML::Element:0x3fd635cf36f4 name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf3514 "foo">]>
doc.search('p') # => [#<Nokogiri::XML::Element:0x3fd635cf36f4 name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf3514 "foo">]>, #<Nokogiri::XML::Element:0x3fd635cf32bc name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf30dc "bar">]>]
doc.at('p').class # => Nokogiri::XML::Element
doc.search('p').class # => Nokogiri::XML::NodeSet
doc.at('p').text # => "foo"
doc.search('p').text # => "foobar"
请注意,使用 search
returned 一个 NodeSet 并且 text
returned 将节点的文本连接在一起。这很少是您想要的。
另请注意,Nokogiri 足够聪明,可以在 99% 的情况下判断选择器是 CSS 还是 XPath,因此对这两种类型都使用通用的 search
和 at
的选择器非常方便。