Важно просверлить ближайший узел, содержащий нужный текст. Рассмотрим это:
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
возвращают Node/XML :: Element. search
, css
и xpath
Верните узел NodeSet. Там есть большая разница в том, как text
inner_html
или возврата информации при взгляде на узел или NodeSet:
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
вернулся NodeSet и text
возвращаемый текст этого узла объединяются вместе. Это редко то, что вы хотите.
Также обратите внимание, что Nokogiri достаточно умен, чтобы выяснить, является ли селектор CSS или XPath 99% времени, поэтому использование общих search
и at
для любого типа селектора очень удобно.
Какие escape-последовательности? Я вижу только вкладки и новые строки, которые будут текстовым содержимым различных текстовых узлов. См. "[Mcve]". Без минимальной выборки HTML трудно дать какой-либо подробный ответ. –