我有一些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
有什么想法吗?
答案 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
。