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.のこぎりオブジェクトにルビーの「送信」を使用できませんか? なぜなら、ルビーハッシュを使用して、実際の「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>

OK、まず、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アクセサーもサポートしているため、必要に応じて2つのスタイル間をジャンプして、必要なノードを特定できます。

CSSは一般的にクリーンでノイズが少ないので、CSSをお勧めします。atとのどちらかを使用できsearchますが、多くの場合、。の代わりに、より明示的なat_cssandat_xpathまたはcssandを使用することがあります。私は怠け者で、より一般的なバージョンのみを使用しています。xpathsearch

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 に答える