Nokogiri replace tag values

余生长醉 提交于 2019-12-02 04:48:48

问题


How to replace "foo" to "bar" ?

From

<h1>foo1<p>foo2<a href="foo3.com">foo4</a>foo5</p>foo6</h1>

to

<h1>bar1<p>bar2<a href="foo3.com">bar4</a>bar5</p>bar6</h1>

I want only replace tag inner content, without tag attributes.

Any ideas ?


回答1:


require 'rubygems'
require 'nokogiri'

doc = Nokogiri::HTML(DATA)

doc.xpath('//text()').each {|foo|
  dummy = foo.add_previous_sibling(Nokogiri::XML::Node.new("dummy", doc))
  dummy.add_previous_sibling(Nokogiri::XML::Text.new(foo.to_s.gsub(/foo/, "bar"), doc))
  foo.remove
  dummy.remove
}
puts doc

__END__
<h1>foo1<p>foo2<a href="foo3.com">foo4</a>foo5</p>foo6</h1>

I would have thought foo.inner_html.gsub!(/foo/, "bar") works or maybe foo.inner_html = foo.inner_html.gsub(/foo/, "bar"), but it doesn't.
The dummy node is to keep the new text node becoming one with the old text node.




回答2:


I could do

nokogiri_doc.css('p').each { |p| p.inner_html = p.inner_html.gsub(/\n/, "<br/>") }

To replace all ocurrences of \n inside p tag to br tags



来源:https://stackoverflow.com/questions/2244539/nokogiri-replace-tag-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!