提问人:jayp 提问时间:10/26/2021 最后编辑:ezkljayp 更新时间:10/27/2021 访问量:373
如何使用 Nokogiri 获取没有任何文本内容的完整 HTML
How to use Nokogiri to get the full HTML without any text content
问:
我正在尝试使用 Nokogiri 来获取页面的完整 HTML,但删除了所有文本。
我试过了这个:
require 'nokogiri'
x = "<html> <body> <div class='example'><span>Hello</span></div></body></html>"
y = Nokogiri::HTML.parse(x).xpath("//*[not(text())]").each { |a| a.children.remove }
puts y.to_s
这将输出:
<div class="example"></div>
我也尝试在没有零件的情况下运行它:children.remove
y = Nokogiri::HTML.parse(x).xpath("//*[not(text())]")
puts y.to_s
但后来我得到:
<div class="example"><span>Hello</span></div>
但我真正想要的是:
<html><body><div class='example'><span></span></div></body></html>
答:
1赞
ezkl
10/27/2021
#1
注意:这是一种非常激进的方法。标记(如 、 和 )还具有包含 CSS、HTML 和 JS 的子节点,您可能不希望根据用例过滤掉这些子节点。<script>
<style>
<noscript>
text()
如果对已分析的文档进行操作,而不是捕获迭代器的返回值,则可以删除文本节点,然后返回该文档:
require 'nokogiri'
html = "<html> <body> <div class='example'><span>Hello</span></div></body></html>"
# Parse HTML
doc = Nokogiri::HTML.parse(html)
puts doc.inner_html
# => "<html> <body> <div class=\"example\"><span>Hello</span></div>\n</body>\n</html>"
# Remove text nodes from parsed document
doc.xpath("//text()").each { |t| t.remove }
puts doc.inner_html
# => "<html><body><div class=\"example\"><span></span></div></body></html>"
评论
1赞
jayp
10/27/2021
谢谢你,@ezkl!这非常有帮助。很好奇,为什么你说这不是解决问题的好方法?
1赞
ezkl
10/27/2021
@jayp 我将更新我的答案,以反映这实际上取决于您的用例,但是如果您要将这种确切的方法应用于更复杂的网页,您最终会在功能标签(如 、 、 等)之间删除子文本节点。<style>
<script>
<noscript>
评论