Удаление всех начальных / конечных пробелов во всем документе:
doc.xpath('//text()').each do |node|
if node.content=~/\S/
node.content = node.content.strip
else
node.remove
end
end
Однако обратите внимание, что это превратит <p>Hello <b>World</b></p>
в <p>Hello<b>World</b></p>
. Скорее всего, вам нужно более точно указать, что вы хотите.
Редактировать: Вот лучшее решение, которое удаляет начальные пробелы из всех текстовых узлов, которые являются первым дочерним элементом элемента, и все конечные пробелы из текстовых узлов, которые являются последними дочерними:
doc.xpath('//text()[1]').each{ |t| t.content = t.content.lstrip }
doc.xpath('//text()[last()]').each{ |t| t.content = t.content.rstrip }
В действии:
html = '<ul>
<li> First text </li>
<li> <strong> Some text </strong> </li>
<li> I am <b> embedded </b> and need <i>some </i> <em>spaces</em>. </li>
</ul>'
require 'nokogiri'
doc = Nokogiri.HTML(html)
doc.xpath('//text()[1]').each{ |t| t.content = t.content.lstrip }
doc.xpath('//text()[last()]').each{ |t| t.content = t.content.rstrip }
puts doc.root
#=> <html><body><ul>
#=> <li>First text</li><li><strong>Some text</strong></li>
#=> <li>I am <b>embedded</b> and need <i>some</i> <em>spaces</em>.</li></ul></body></html>
Редактировать # 2: Вот как убрать его с текстовых узлов в начале <li>
:
doc.xpath('//li/text()[1]').each{ |t| t.content = t.content.lstrip }