ruby - 在 Nokogiri 对象上使用 ruby​​ "send"作为 page.send(a) 其中 ="at(' div.class-name')"

标签 ruby class nokogiri mechanize send

现在,这是我的 HTML,

<div class = 'div-of-all-names'>
  <div class='best-first-name'>
    <span itemprop='name'> Alexander </span>
  </div>
</div>

我的 Ruby 程序中有这个哈希,

URL = "http://www.xxx.com/xxxxxxxxxxxxxxxx/xxxxxxxxxxx/xxxxxxxx"
agent = Mechanize.new
page = agent.get(URL)

patterns = {1 => ['at("div.div-of-all-names")'],
            2 => ['at("div.best-first-name")'] ,
            3 => ['search("span[@itemprop='name']")']}

# Selecting those keys that is a number and sorting
p = patterns.keys.select{|i|  /[0-9]/ =~ i.to_s }.sort
# p = [1,2,3]

p.each do |i|
  p[i].each do |j|
    out = page.send(j)
    if !(out.blank?)  
      page = out
      p j
      break
    end
  end
end
name = page.inner_text
p name

问题:

<强>1。我不能在 Nokogiri 对象上使用 ruby​​ 的“发送”吗? 因为,我可以使用 ruby​​ 散列并将实际的“search”或“at”与“class”、“id”、“itemprop”或散列中的任何 html 属性一起存储为级别 1、2 和 3。 一旦将它们存储为级别,我将从中检索它们作为“i”或“j”中的循环变量,并在 Nokogiri 对象上使用“.send(j)”。

我试过了,但出现了这个错误,

1.9.3p385 :238 > a
 => "at(\"div.our_price\")" 
1.9.3p385 :239 > page.send(a)
NoMethodError: undefined method `at("div.our_price")' for #<Mechanize::Page:0xb2ba6dc>
    from (irb):239

<强>2。如果我使用“at”,我只能操作类吗? 比如,

"page.at('span.humble')" 
**means** 
<-span-class ='humble'>
     Humble
  <-/-span>
**then what about** 
<-span-id='humble'>
     Humble
  <-/-span>

最佳答案

需要单独给出方法名和参数发送:

obj.send("methodname", "arg1", "arg2")

关于ruby - 在 Nokogiri 对象上使用 ruby​​ "send"作为 page.send(a) 其中 ="at(' div.class-name')",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551696/

相关文章:

python - 我应该从类内部创建一个类实例吗?

c++ - 编译器说成员未声明,显然不是。 (SDL)

ruby - 如何获取nokogiri属性值?

ruby-on-rails - '需要': cannot load such file -- 'nokogiri\nokogiri' (LoadError) when running `rails server`

ruby - 返回 Rails 中公共(public)字符数的函数

Ruby - rails - 减去日期时间

ruby - ruby 的反射?

ruby-on-rails - 运行 "bundle"时的 Bundler 警告 - Ruby on Rails

python - 从类元素中创建 python 列表的副本

ruby - XPath 轴,获取所有后续节点直到