gpt4 book ai didi

ruby - 保留 HTML 页面的结构,删除所有文本节点

转载 作者:太空宇宙 更新时间:2023-11-03 18:30:48 24 4
gpt4 key购买 nike

我想从使用 nokogiri 加载的 html 页面中删除所有文本。例如,如果页面具有以下内容:

<body><script>var x = 10;</script><div>Hello</div><div><h1>Hi</h1></div></body>

我想用 Nokogiri 处理它并在像这样剥离文本后返回如下 html:

<body><script>var x = 10;</script><div></div><div><h1></h1></div></body>

(也就是说,删除实际的 h1 文本、div 之间的文本、p 元素中的文本等,但保留标签。另外,不要删除脚本标签中的文本。)

最佳答案

require 'nokogiri'
html = "<body><script>var x = 10;</script><div>Hello</div><div><h1>Hi</h1></div></body>"
hdoc = Nokogiri::HTML(html)
hdoc.xpath( '//*[text()]' ).each do |el|
el.content='' unless el.name=="script"
end

puts hdoc
#=> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
#=> <html><body>
#=> <script>var x = 10;</script><div></div>
#=> <div><h1></h1></div>
#=> </body></html>

警告:因为您没有指定如何处理类似 <div>foo<h1>bar</h1></div> 的案例以上可能会或可能不会做你期望的。或者,以下可能符合您的需求:

hdoc.xpath( '//text()' ).each do |el|
el.remove unless el.parent.name=="script"
end

更新

这是一个更优雅的解决方案,它使用单个 xpath 来选择不属于 <script> 的所有文本节点。元素。我添加了更多文本节点来展示它如何处理它们。

require 'nokogiri'
hdoc = Nokogiri::HTML <<ENDHTML
<body>
<script>var x = 10;</script>
<div>Hello</div>
<div>foo<h1>Hi</h1>bar</div>
</body>
ENDHTML
hdoc.xpath( '//text()[not(parent::script)]' ).each{ |text| text.remove }
puts hdoc
#=> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
#=> <html><body>
#=> <script>var x = 10;</script><div></div>
#=> <div><h1></h1></div>
#=> </body></html>

对于 Ruby 1.9,内容更简单:

hdoc.xpath( '//text()[not(parent::script)]' ).each(&:remove)

关于ruby - 保留 HTML 页面的结构,删除所有文本节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4530027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com