Nokogiri 在带有 .empty 的空字符串上返回 False?

Nokogiri Returning False on Empty String With .empty?

我正在尝试使用基于 gem、ruby-readability 的 Nokogiri 从文档中删除空的 <p> 标签。在控制台中使用 .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

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

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
=> "[]"

32 十进制是十六进制的 0x20"\u0020",这是 UTF-8 中的单个 space 并且 String#strip 知道如何处理它.字节 [194, 160]"\u00a0" 这是一个 non-breaking space: it looks like a space but String#strip 不会将其识别为白色 space 因为:

Whitespace is defined as any of the following characters: null, horizontal tab, line feed, vertical tab, form feed, carriage return, space.

您可以使用 whitespace character property 而不是 #strip:

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