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



现在,这是我的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哈希并将实际的"搜索"或"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")

如果我使用"at",我只能操作类吗?

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

好的,首先,不要编造方法来突出显示HTML。使用正常的格式和普通的HTML,如果有必要,把它放在一个单独的部分,否则你会混淆我们,有人会告诉你问题是无效的HTML。在你的问题中至少应该是这样的:

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

的方式…

为什么你认为你不能使用id ?你正在定义一个CSS访问器,所以使用一个ID:

page.at('span#humble')

atsearch一样,不局限于类或id。如果您可以将其定义为CSS(包括许多jQuery扩展),那么Nokogiri应该能够找到它。Nokogiri还支持XPath访问器,因此您可以根据需要在两种样式之间跳转,以精确定位所需的节点。

我推荐CSS,因为它通常更干净,更少噪音。您可以使用atsearch,即使您经常看到人们使用更明确的at_cssat_xpathcssxpath而不是search。我很懒,只使用更通用的版本。

我强烈建议花点时间阅读Nokogiri的文档。它非常强大,允许您整天修改HTML/XML。

似乎您正在为instance_eval设置这些,而不是发送:

page.instance_eval 'at("div.div-of-all-names")'

相关内容

  • 没有找到相关文章

最新更新