设置元素的属性,然后将结果作为字符串返回

时间:2016-01-11 23:17:07

标签: ruby-on-rails ruby string html-parsing nokogiri

我有一些HTML,像这样:

html = "<h1>Title One</h1>\n\n<p>blah blah</p>\n\n<h1>Title Two</h1>\n\n<p>blah blah</p>\n"

我需要为每个h1元素提供一个id属性,其中id的值是h1的文本,然后再将整个事物作为字符串返回,因此结果是这样的:

"<h1 id="title-one">Title One</h1>\n\n<p>blah blah</p>\n\n<h1 id="title-two">Title Two</h1>\n\n<p>blah blah</p>\n"

我尝试了很多不同的事情,我已经能够设置属性,但不能将其变回字符串。

基本上,我想做这样的事情,但显然这不起作用:

new_html = Nokogiri::HTML.parse(html).xpath('//body').children do |el|
  if el.name == 'h1'
    id = el.children.text.parameterize
    el.set_attribute('id', id)
  end
end
new_html.to_s

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

你太难了很多。考虑一下:

require 'nokogiri'

html = "<h1>Title One</h1>\n\n<p>blah blah</p>\n\n<h1>Title Two</h1>\n\n<p>blah blah</p>\n"
doc = Nokogiri::HTML::DocumentFragment.parse(html)

doc.search('h1').each do |h1|
  h1['id'] = h1.text.tr(' ', '-')
end

puts doc.to_html

# >> <h1 id="Title-One">Title One</h1>
# >> 
# >> <p>blah blah</p>
# >> 
# >> <h1 id="Title-Two">Title Two</h1>
# >> 
# >> <p>blah blah</p>

剩余的如何使ID值看起来如你所愿,让你想出来。

  

我已经能够设置属性,但不能将其变回字符串。

HTML和字符串有什么区别? HTML 是一个字符串,因此请使用to_html