Rubyパート2でのWebスクレーピング


これは、チュートリアルの一部です。



最後に私たちはいくつかの簡単なカテゴリを取得し、一部の1つを見ることができます
ここでは、より深く行きます.我々は、それに戻るために、しかし、単純に出発します.深いリンクを行くが、下にスクロールするときは、別のページに移動することなく、完全な概要を参照してくださいトップを含むプロットがあります.多くのエピソードをこすっているとき、これは我々に時間を節約するので、それを使いましょう.
<div class="inline canwrap">
            <p>
                <span>    The Pinky and The Brain who live in the future travel back in time to give their present-dwelling counterparts a book on how to take over the world. The present pair travel to the future and find themselves in a world where cockroaches and are ruling the planet. After being captured, they escape to their capsule, which takes them safely back to the lab. But when Pinky leaves the book in the capsule, the craft vanishes, leaving the jet-lagged mice pondering how to take over the world yet again.</span>
                <em class="nobr">Written by
<a href="/search/title?plot_author=Anonymous&amp;view=simple&amp;sort=alpha&amp;ref_=tt_stry_pl">Anonymous</a></em>            </p>
        </div>
我々はそれがCanwrapと呼ばれるクラスであることを見る地域を強調します.試してみましょう.もう一度クラスを見て、あなたは名前の前に.narf.get_text(parsed_episode.css('.canwrap'))hmm結果は以下の通りです
=> ["The Pinky and The Brain who live in the future travel back in time to give their present-dwelling counterparts a book on how to take over the world. The present pair travel to the future and find themselves in a world where cockroaches and are ruling the planet. After being captured, they escape to their capsule, which takes them safely back to the lab. But when Pinky leaves the book in the capsule, the craft vanishes, leaving the jet-lagged mice pondering how to take over the world yet again.\n                Written by\nAnonymous",
 "Plot Keywords:\n friendship\n                        |\n friends who live together\n            | See All (2) »",
 "Genres:\n Animation |\n Comedy |\n Family |\n Sci-Fi"]
少しは、より具体的にしようとしてみましょう、さらに一歩を踏み出しましょう.あなたは“>”CSSセレクタを使用して、あなたが見ている子供に入れてそれを行うことができます.試しましょう.canwap > p さて、それはまだ私たちに書かれています.もう一つのセレクタ.canwap > p > span それは私たちに1アイテムの配列を与えるために働いた.次に、私たちの練習を拡大するために何か違うものを試してみることができます.あなたが正確にどこにすることができます知っているとき.代わりに.CSSだからparsed_episode.at('.canwrap > p > span')).text . 字下げを文字列で返す" The Pinky and The Brain who . 投げましょう.ストリップは、最後に、あなたが欲しいものを取得します.それが配列のために使われるので、我々はGetCountテキスト関数を使用しません.したがって、この関数は次のようになります.
def plot
   parsed_episode.at('.canwrap > p  > span').text.strip
end

さあ、もっと難しいことに取り組もう.キャストを見ましょう.すべてのデータはテーブルにあります、我々がそれから得るものを見ましょう.
CSSを見るtd > a 結果を与える" Maurice LaMarche\nThe BrainQueen Roach's Aid Rob Paulsen\nPinky Tress MacNeille\n Frank Welker\n" ... 彼らはリンクを持っていないので、我々は非定期的な文字を失う.それで、それは役に立ちません、また、どのように、我々は俳優が終わるか、性格が始まるところを理解することができますか?もっと具体的なものを試してみましょう.
これで楽しみましょう.写真から自分自身をガイドし、また別の配列として右に文字を収集し、それらの文字に参加しましょう.それで、写真は俳優名のタイトルを持ちます.写真に移動しましょうparsed_episode.css('.primary_photo > a > img')それは私たちに配列を与えるので、最初の項目を見てみましょう.
=> #(Element:0x3ff3fd8e31c8 {
  name = "img",
  attributes = [
    #(Attr:0x3ff3fd8e3178 { name = "height", value = "44" }),
    #(Attr:0x3ff3fd8e3164 { name = "width", value = "32" }),
    #(Attr:0x3ff3fd8e3150 { name = "alt", value = "Maurice LaMarche" }),
    #(Attr:0x3ff3fd8e313c { name = "title", value = "Maurice LaMarche" }),
しかし、我々はそれに俳優の名前を持っている!グレート.これが要素インスタンスであるので、一番上の2つの項目(名前、属性)をメソッド呼び出しで取得できます.
それで、我々が入るならば.属性は、ハッシュのように見えます.
=> {"height"=>#(Attr:0x3ff3fd8e3178 { name = "height", value = "44" }),
 "width"=>#(Attr:0x3ff3fd8e3164 { name = "width", value = "32" }),
 "alt"=>#(Attr:0x3ff3fd8e3150 { name = "alt", value = "Maurice LaMarche" }),
 "title"=>#(Attr:0x3ff3fd8e313c { name = "title", value = "Maurice LaMarche" }),
いいえ、我々はちょうどタイトルに入る必要があります.もう一つの属性!!!だから今すぐ機能全体を取得しましょうparsed_episode.css('.primary_photo > a > img')[0].attributes["title"].value ちょうどモリスを与えてください、それらのすべてを得る機能を書きましょう.
def actors
    parsed_episode.css('.primary_photo > a  > img').map {|inner| inner.attributes["title"].value}
end
それは、偉大な俳優の配列を与える.それは我々が秩序を持つことができるように我々が欲しいものです.
それではTDを試してみましょう.文字、それは合理的です.配列の最初の結果は"\n The Brain / \n Queen Roach's Aid \n \n \n (voice)\n \n \n " うわー、それは混乱です..取り除きましょう."The Brain / \n Queen Roach's Aid \n \n \n (voice)" まだそれほど大きくはないので、我々はこれを配列の一つの一部として維持したいので、私たちは俳優と共に登場することができます.…Rubyにはregexが組み込まれています.これらの改行とスペースを一つのスペースに変えましょう.あなたはそれを行うことができます.gsub (/[::space :]]/", ""),"ストリップ.それで、すべてをまとめるなら、
def characters
    chars = parsed_episode.css('td.character').map {|char| char.text.strip}
    chars.map { |char| char.gsub(/[[:space:]]+/, " " ).strip}
end
これは
=> ["The Brain / Queen Roach's Aid (voice)",
 "Pinky (voice)",
 "Queen Roach / First Lady / Time Machine Computer (voice)",
 "The President (voice)"]
それはすべてのラインアップされます!

ハッシュでそれらを整列しましょう.キーとしてのアクター.文字がスラッシュで区切られているのを覚えておいてください.ここでは、単純な関数が描画されます.
def cast_assesment
    i = 0
    cast = {}
    while i < actors.length
        cast[actors[i]] = characters[i].split(" / ")
        i+=1
    end

    cast
end
覚えておいてください、私たちはクラスでこれをしています、したがって、俳優と性格は関数と呼ばれています.したがって、これらの関数が返される配列を繰り返すだけです.我々が得るものを見ましょう.
[1] pry(main)> narf.cast_assesment
=> {"Maurice LaMarche"=>["The Brain", "Queen Roach's Aid (voice)"],
 "Rob Paulsen"=>["Pinky (voice)"],
 "Tress MacNeille"=>["Queen Roach", "First Lady", "Time Machine Computer (voice)"],
 "Frank Welker"=>["The President (voice)"]}
完璧な!さて、今度は乗組員に取り組むつもりです.作家とディレクター、それはもう少し複雑になるので.また、JSONにも書きます.


ここでコードを見つけることができますhttps://github.com/AmSmo/webscraper_narf 第1部は別途