【问题标题】:Nokogiri Returning False on Empty String With .empty?Nokogiri 使用 .empty 对空字符串返回 False?
【发布时间】:2021-05-04 09:11:21
【问题描述】:

我正在尝试使用基于 Nokogiri 的 gem ruby-readability 从文档中删除空的 <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 文档中的 &lt;p&gt; &lt;/p&gt; 行:

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 文档中添加了一个新元素:&lt;p&gt;&lt;/p&gt;。如果我打电话给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
=> "[]"

【问题讨论】:

  • 您确定node.css 块内的element.content 恰好是一个空格而不是其他空格吗?
  • 我在 HTML 文档中添加了它,就像我在 IRB 中添加它一样,如上所述。会是怎样的“别的东西”?你的意思是像&amp;nbsp;这样的东西吗?如果我将puts "'#{element.content.strip.empty?}'" 放在node.css 块中,它会返回''
  • 我在想"\u00a0" 之类的东西。 element.content.bytes.inspect 长什么样子?
  • 在 IRB 中返回 "[32]"。在循环内它返回[194, 160]

标签: ruby nokogiri


【解决方案1】:

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

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

您可以使用whitespace character property 代替#strip

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

【讨论】:

  • 好像明白了。感谢您的详细解释和额外资源。
  • 不客气。 Unicode 可以是一个巨大的 PITA,但比其他替代品要少得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 2011-12-04
  • 2019-07-08
  • 2017-12-14
  • 1970-01-01
  • 2022-09-27
  • 2013-12-06
相关资源
最近更新 更多