如何使用 Nokogiri 获取没有任何文本内容的完整 HTML

How to use Nokogiri to get the full HTML without any text content

提问人:jayp 提问时间:10/26/2021 最后编辑:ezkljayp 更新时间:10/27/2021 访问量:373

问:

我正在尝试使用 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>
Ruby 网页抓取 XPath HTML 解析 Nokogiri

评论


答:

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>