如何使用 Nokogiri 获取没有任何文本内容的完整 HTML
Posted
技术标签:
【中文标题】如何使用 Nokogiri 获取没有任何文本内容的完整 HTML【英文标题】:How to use Nokogiri to get the full HTML without any text content 【发布时间】:2021-12-11 08:45:36 【问题描述】:我正在尝试使用 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】:注意:这是一种非常激进的方法。 <script>
、<style>
和 <noscript>
等标签也有子 text()
节点,其中包含您可能不想根据用例过滤掉的 CSS、HTML 和 JS。
如果您对已解析的文档进行操作而不是捕获迭代器的返回值,您将能够删除文本节点,然后返回文档:
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>"
【讨论】:
谢谢你,@ezkl!这非常有帮助。很好奇为什么你说这不是解决问题的好方法? @jayp 我将更新我的答案以反映它确实取决于您的用例,但如果您要将这种确切的方法应用于更复杂的网页,您最终会丢弃子文本节点在<style>
、<script>
、<noscript>
等功能标签之间以上是关于如何使用 Nokogiri 获取没有任何文本内容的完整 HTML的主要内容,如果未能解决你的问题,请参考以下文章
创建“Nokogiri::XML”或“Nokogiri::HTML”对象时如何避免创建无意义的空白文本节点
如何使用 Nokogiri 插入具有适当缩进的 HTML 块?