hel*_*rld 1 html css ruby nokogiri
我在一个名为的变量中有以下 HTML,html_data我希望<img>用<a>标签替换标签,并且src“img”标签的参数变为href“a”标签。
现有的 HTML:
<!DOCTYPE html>
<html>
<head>
<title>Learning Nokogiri</title>
</head>
<body marginwidth="6">
<div valign="top">
<div class="some_class">
<div class="test">
<img src="apple.png" alt="Apple" height="42" width="42">
<div style="white-space: pre-wrap;"></div>
</div>
</div>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案A:
nokogiri_html = Nokogiri::HTML(html_data)
nokogiri_html("img").each { |tag|
a_tag = Nokogiri::XML::Node.new("a", nokogiri_html)
a_tag["href"] = tag["src"]
tag.add_next_sibling(a_tag)
tag.remove()
}
puts 'nokogiri_html is', nokogiri_html
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案B:
nokogiri_html = Nokogiri::HTML(html_data)
nokogiri_html("img").each { |tag|
tag.name= "a";
tag.set_attribute("href" , tag["src"])
}
puts 'nokogiri_html is', nokogiri_html
Run Code Online (Sandbox Code Playgroud)
虽然解决方案 A 工作正常,但我正在寻找是否有更快/直接的方法来使用 Nokogiri 替换标签。使用解决方案 B,我的“img”标签确实被“a”标签替换,但“img”标签的属性仍然保留在“a”标签内。下面是解决方案B的结果:
<!DOCTYPE html>
<html>
<body>
<p>["\n", "\n", " </p>
\n", "
<title>Learning Nokogiri</title>
\n", " \n", " \n", "
<div valign='\"top\"'>
\n", "
<div class='\"some_class\"'>
\n", "
<div class='\"test\"'>
\n", " <a src="%5C%22apple.png%5C%22" alt='\"Apple\"' height='\"42\"' width='\"42\"' href="%5C%22apple.png%5C%22"></a>\n", "
<div style='\"white-space:' pre-wrap></div>
\n", "
</div>
\n", "
</div>
\n", "
</div>
\n", " \n", ""]
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
有没有办法使用 Nokogiri 更快地替换 HTML 中的标签?另外如何删除结果中的“\n”?
首先,请将示例数据 (HTML) 精简到演示问题所需的最少量。
以下是做你想做的事情的基础知识:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<!DOCTYPE html>
<html>
<body>
<img src="apple.png" alt="Apple" height="42" width="42">
</body>
</html>
EOT
doc.search('img').each do |img|
src, alt = %w[src alt].map{ |p| img[p] }
img.replace("<a href='#{ src }'>#{ alt }</a>")
end
doc.to_html
# => "<!DOCTYPE html>\n<html>\n <body>\n <a href=\"apple.png\">Apple</a>\n </body>\n</html>\n"
puts doc.to_html
# >> <!DOCTYPE html>
# >> <html>
# >> <body>
# >> <a href="apple.png">Apple</a>
# >> </body>
# >> </html>
Run Code Online (Sandbox Code Playgroud)
通过这种方式,Nokogiri 可以干净地替换节点。
没有必要做所有这些繁琐的事情:
a_tag = Nokogiri::XML::Node.new("a", nokogiri_html)
a_tag["href"] = tag["src"]
tag.add_next_sibling(a_tag)
tag.remove()
Run Code Online (Sandbox Code Playgroud)
相反,创建一个您想要使用的标签字符串,然后让 Nokogiri 将字符串转换为节点并替换旧节点:
src, alt = %w[src alt].map{ |p| img[p] }
img.replace("<a href='#{ src }'>#{ alt }</a>")
Run Code Online (Sandbox Code Playgroud)
没有必要去除节点之间无关的空白。它可能会影响 HTML 的外观,但浏览器会吞噬掉多余的空白而不显示它。
Nokogiri 可以被告知不要输出节点间空白,从而导致压缩/模糊的输出,但如何做到这一点是一个单独的问题。
| 归档时间: |
|
| 查看次数: |
1963 次 |
| 最近记录: |