2

在 Hpricot 文档(位于https://github.com/hpricot/hpricot)中有一个 doc.search() 方法。然后文档继续说“捷径是使用除数”:

(doc/"p.posted")

它可以工作,这是肯定的,但我想知道,这是什么符号?我以前从未遇到过。

4

3 回答 3

4

Hpricot(和 Nokogiri,因为它支持 Hpricot 的快捷方式)支持“搜索”的两种快捷方式,(/)和“at”(%)。

Search意思是“找到这个模式的所有出现”并且at意味着找到第一个出现。Search返回节点列表,同时at返回单个节点,当您要访问节点的内容时必须牢记这一点。

通常,at它适用于您知道是唯一且不想重复的标签或 ID。Search用于遍历表格中的所有行或<p>文档中的每个标签之类的事情。您还可以从 链接%,这对于查找特定节点很有用,然后下降到它。

require 'hpricot'

html = '
<html>
  <head><title>blah</title>
  <body>
    <div id="foo">
      <p>paragraph1</p>
      <p>paragraph2</p>
    </div>
  </body>
</head>
'
doc = Hpricot(html)

doc.at('title').inner_text  # => "blah"
(doc / 'p').last.inner_text # => "paragraph2"
(doc % 'p').inner_text # => "paragraph1"
(doc % '#foo').search('p').size # => 2

就个人而言,我推荐Nokogiri而不是 Hpricot。它支持所有快捷方式,但功能更全面,并且得到很好的支持。

/而且,快捷方式%并不是我见过的任何标准的一部分;它们是 Hpricot 的本地人,为了方便而被 Nokogiri 继承。我不记得在 Perl 或 Python 解析器中看到过它们。

于 2011-01-25T01:57:02.637 回答
3

该表示法可能是为了使用重载运算符调用XPath/

/ 选择文档根(始终是文档元素的父级)

运算符需要两个参数,LHS 提供重载上下文,所以你必须说

doc/"p.posted"

而不仅仅是

/"p.posted"
于 2011-01-24T17:11:51.277 回答
2

/只是一个常规方法,可以以中缀样式调用:

>> 8 / 2 #=> 4
>> 8./ 2 #=> 4

只需为您自己的类定义一个:

>> class Myclass
..   def /(n)
..     "Yeah" * n
..     end
..   end #=> nil
>> Myclass.new / 5 #=> "YeahYeahYeahYeahYeah"
于 2011-01-24T13:48:40.353 回答