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.inspect
或 element.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?
我正在尝试使用基于 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.inspect
或 element.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?