在Hpricot文档(https://github.com/hpricot/hpricot)中有一个doc.search()方法。然后,文档继续说“快捷方式是使用除数”:
(doc/"p.posted")
它有效,这是肯定的,但我想知道,这是什么表示法?我以前从未见过它。
答案 0 :(得分: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解析器中看过它们。
答案 1 :(得分:3)
符号可能意味着使用重载的/
运算符唤起XPath:
/选择文档根目录(始终是文档元素的父目录)
运算符需要两个参数,LHS提供重载上下文,所以你必须说
doc/"p.posted"
而不仅仅是
/"p.posted"
答案 2 :(得分:2)
/
只是一个常规方法,可以用中缀样式调用:
>> 8 / 2 #=> 4
>> 8./ 2 #=> 4
只需为自己的类定义一个:
>> class Myclass
.. def /(n)
.. "Yeah" * n
.. end
.. end #=> nil
>> Myclass.new / 5 #=> "YeahYeahYeahYeahYeah"