首页 > 解决方案 > Nokogiri 使用 .empty 对空字符串返回 False?

问题描述

我正在尝试使用基于 Nokogiri 的 gem ruby<p> ​​-readability 从文档中删除空标签。在控制台中使用可以正常工作,如下所示:.strip.empty?

irb> p = Nokogiri::HTML("<p> </p>")
=> #<Nokogiri::HTML::Document...
irb> p.content
=> " "
irb> p.content.strip
=> ""
irb> p.content.strip.empty?
=> true

在ruby​​-readability gem中运行相同的操作,正在返回false

在该方法中,我添加了一个额外的调用来测试<p> </p>我的测试 HTML 文档中的行:

if @options[:remove_empty_nodes]
  node.css("p").each do |elem|
    puts "IS IT EMPTY?"
    puts element.content.strip.empty?
    elem.remove if elem.content.strip.empty?
  end
end
IS IT EMPTY?
false

为什么这又回来了false

更新:

根据下面的讨论,我在 HTML 文档中添加了一个新元素:<p></p>. 如果我打电话element.content.bytes.inspectelement.content.strip.bytes.inspect得到这个:

ELEMENT:
<p> </p>
[194, 160]
ELEMENT:
<p></p>
[]

在 IRB 中,.strip似乎正在工作:

irb> p.content.bytes.inspect
=> "[32]"
irb> p.content.strip.bytes.inspect
=> "[]"

标签: rubynokogiri

解决方案


32十进制是0x20十六进制或"\u0020",这是UTF-8中的一个空格,并且String#strip知道如何处理它。字节[194, 160]"\u00a0"一个不间断的空格:它看起来像一个空格,但String#strip不会将其识别为空格,因为:

空白定义为以下任何字符:null、水平制表符、换行符、垂直制表符、换页符、回车符、空格。

您可以使用空格字符属性而不是#strip

elem.remove if elem.content.gsub(/\p{Space}/, '').empty?

推荐阅读