1

现在,这是我的 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>
4

3 回答 3

2

您需要分别给出方法名称和参数发送:

obj.send("methodname", "arg1", "arg2")
于 2013-03-21T15:49:05.283 回答
1

如果我使用“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')

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

我推荐 CSS,因为它通常更干净,噪音更小。您可以使用 with atand search,即使您经常会看到人们使用更明确的at_cssand at_xpathor cssandxpath来代替search。我很懒,只使用更通用的版本。

我强烈建议花一些时间阅读 Nokogiri 的文档。它非常强大,可以让您整天处理 HTML/XML。

于 2013-03-21T19:28:11.287 回答
1

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

page.instance_eval 'at("div.div-of-all-names")'
于 2013-03-21T22:40:03.450 回答