• 締切済み

Nokogiriスクレイピングがうまくできない。

Nokogiriスクレイピングがうまくできない。 RubyのNokogiriを利用して、下記サイトのデータを整理するためにスクレイピングをしようと思っています。 https://sv.j-cg.com/compe/view/entrylist/1274 具体的には、サイト中部の「登録デッキ」の一覧にある使用クラスのデータをまとめるプログラムを組もうと思っています(添付画像参照)。 XPathのサイトを参考にしつつ、試しにこの使用クラスの画像データをテキストで出力するため以下のコードを組んで実行しました。 require 'nokogiri' require 'open-uri' url = 'https://sv.j-cg.com/compe/view/entrylist/1274' charset = nil html = open(url) do |f| charset = f.charset f.read end doc = Nokogiri::HTML.parse(html, nil, charset) p doc.xpath('//img[contains(@src,"clans")]') ですが、 [] と表示されるだけで何も取得できません。 containsの引数を(取得対象のimg要素内の)どの値に変えて試しても、色んな表示が出はするのですが肝心の画像URLの部分が取得できません。 (ページのソースコードを見た所、使用クラスの判別が画像URLでしか出来ないため、URLをまず取得しないことには目的を達成できないだろう、という前提で話しています。) 私の推測では、どうやらURL部分だけjsonファイルらしい(他者には見られない)外部のファイルから引っ張ってきているため、プログラムから読み取ろうとしてもうまくURLを引用できないのだと思ってます。 ですが、ブラウザ上の検証ツールではURLが表示されるのにプログラムでは正しく読み込めないのが疑問です。 何にせよ、うまく使用リーダーを整理する方法があったら教えていただきたいと思います。 (ちなみにスクレイピングで画像URL等を取得した後のうまい整理方法も現段階ではよくわかっていないですが、とりあえずこのURLデータ取得だけでもまず理解してからということで質問をしています。)

  • Ruby
  • 回答数1
  • ありがとう数1

みんなの回答

  • silencezt
  • ベストアンサー率100% (1/1)
回答No.1

別の話ですが、スクレイピングツールを使っています。 画像URLの取得が簡単です。

参考URL:
http://jp.octoparse.com/tutorial/extract-data/
ont_rt
質問者

お礼

rubyでスクレイピングしたいんですが、まぁ参考にしてみます

関連するQ&A

  • 動的なページのスクレイピング

    動的なページのスクレイピング まず下記のurl御覧ください。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q131988243... これで「静的なページの」スクレイピングできるようになったはいいのですが、問題はここからです。 https://sv.j-cg.com/compe/view/entrylist/1489 ↑このような、「ある程度スクロールすると追加でコンテンツが読み込まれるページ」については、正しくスクレイピングできませんでした。 「JavaScriptを実行させて、変化後の要素を取得する」ためにヘッドレスブラウザ(phantomjs)を使っているはずなのに、これは腑に落ちなさすぎるんですが。。 ググったところ、やっぱり「phantomjsを使う」のは正しい解決法のようなんですが、 (これとか→https://ja.stackoverflow.com/questions/19681/nokogiri%E3%81%A7%E5%8...) やっぱり追加後のDOM?については解析できませんでした。 JCGのサイトについてはスクロール時に読み込まれるのはjavascriptの仕様ではないのか、はたまたコードがよくないのか… 教えてください。

  • ウェブページから手軽にスクレイピングしたい

    ウェブページに対して、XPATHを書く事で手軽にテキストデータを取得できないかと思っています。 イメージしているのは、プログラムを書いてスクレイピングするのではなく、ブックマークレットみたいな感じで、ウェブページに対してXPATHを書いたらすぐにスクレイピング結果のテキストデータが取得できるようなものです。 HighlightXPath( http://haraita9283.blog98.fc2.com/?tag=Bookmarklet )っていうのがありますが、こんな感じにブックマークレットを呼び出してXPATHを書いたらパっとテキストデータが取得できるようなもの、ないでしょうか。

  • Xpathがわからない。

    capybaraとXpathを使ってrubyスクレイピングをしようとしています。 まず添付画像を御覧ください。 ゴールは添付画像のurl部分を(文字列として)抽出することです。(末尾がclans/7.pngみたいになってるやつです) 条件として、添付画像のように、親要素の親要素のクラスに "checkedin"を含むこと。 (画像では省略されていますが、本来のソースコードでは添付画像の一番上の要素に類するものがいくつも並んでいます。その中から、画像のように "checkedin" を含むものを抽出しようとしています) 親要素の親要素の条件を指定しない場合は images = session.find_all(:xpath, '//img[contains(@src,"clans")]') puts images[i][:src] といったコードでURLを抽出できたのですが、上述の条件を指定する場合にどのような記述をすれば良いかわかりません。 checkedin = session.find_all(:xpath, 'tr[contains(@class,"checkedin") and .//img[contains(@src,"clans")]]') と書いたり他色々試しましたが、全てエラーです。 上述の条件を指定して記述するにはどうすればいいのでしょうか。。 (先祖要素の条件指定でなく、まず先祖要素の条件を指定してから子要素のurl抽出をするのもあると思いそれっぽい手法を試しましたが、capybaraそのものが良くわかっておらずエラーになります) (ちなみにcapybaraを使っているのは、以前質問した時におすすめされたからです。 詳細URL→https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13198824358 本当はnokogiriでやりたかったのですが、nokogiriですとurl部分が正常に取得できませんでした。 nokogiriでもurl部分を正しく抽出できる方法があれば是非教えてください。capybaraよりnokogiriの方が使いやすいので。。) 質問の回答になっていないそもそも論は禁止でお願いします。(python使え等)

  • ruby のプログラムについての質問です。

    ruby初心者です。作成したプログラムについて質問です。 某サイトの<td>セクター部分のデータを取得するプログラムを作ろうとしています。このプログラムのソースをあげときます。 # encoding: utf-8 require 'rubygems' require 'open-uri' require 'nokogiri' doc = Nokogiri::HTML(open("http://creofuga.net/"),nil,"utf-8") doc.css("td").each do |td| open("foo.txt", "w") do |f| f.write td.text end end このプログラムだと、最初のからデータを取得していくのですが、textファイルに書き込む際、1行目で得たデータを上書きをし、最終的に、サイトの最後の出たのみ出力する形となります。これをデータごとに改行しすべてのデータを出力するにはどのようにプログラムを変更すれば、よいかおしえてください。おねがいします。ちなみに最後に画像で取得したtextファイルのデータを上げときます。よろしくお願いします。

  • Ruby初学者です。

    Ruby初学者です。 スクレイピングをしています。 Capybara + PhantomJSを用いているのですが(動的要素も取得したいため)、 session.visit "sample.com" variable = session.find_all(:xpath,"//a[contains(text(), "なんとか")]") puts variable といったコードを書くと #<Capybara::Result:0x0325d6honyaefccf0f8> という風な表示がされてしまいます。 上記の例に限らず、xpathで抽出したものをputs等を用いて表示しようとすると、上述のようにわけのわからん表示が出てきて困ります。 Nokogiriだとputsを使うとDOM?html?がそのまま文字通り表示されてくれるのですが。。 Capybaraだと何らかの変換を行うような処理がされてしまっているのですかね。(というかputsでコードを表示するような目的のものではない?) 解決方法(抽出したコードをputsでそのまま表示する方法)があれば教えてください。

  • Ruby Selenium リンクの取得方法

    こんばんは。 Ruby初心者ですが、現在、Selenium Webdriver、chromeにはまり、スクレイピングのような事をしています。 そんな中で困っている事があるのですが、 とあるサイトの画像URLを取得、テキストに追記で書き出ししようと色々と調べたのですが全く分からず困っています。 <div class="hoge"> <img src="http://hoge" alt=""> </div> htmlはこんなようでxpathは/hoge/imgと仮定します。 open("hoge.txt", "a"){|f| output = driver.find_element(:xpath, '/hoge/img') f.puts "#{output.text}" } のように書いてみたもののテキストに改行しか出力されない状態です。 何卒どうかご教授、よろしくお願いします。

    • ベストアンサー
    • Ruby
  • DOMDocumentの文字化けに悩まされています

    cURLを使った場合のエンコードに悩まされています。 $http = new SimplecURL($url); /*cURLを使って指定ページのhtmlを取得する自己関数*/ $html = $http->execute(); $html = mb_convert_encoding($html, "UTF-8", "auto"); この後、取得したHTMLを、 $doc = new DOMDocument(); @$doc->loadHTML($html); $xpath = new DOMXPath($doc); //body部から該当するUrlを抽出 $extracts = $xpath->query($xPath); foreach ($extracts as $value) { $results = trim($value->nodeValue); $results[] = $result; } のようにして取得しているのですが、日本語が文字化けする場合が非常に多いです。 $html = mb_convert_encoding($html, "UTF-8", "auto"); とか、 $result = mb_convert_encoding($result, 'UTF-8', 'auto'); とかするのですがダメです。 色々なサイトでそうなのですが、例えばShift-JISで書かれていると思われる http://www.nhk.or.jp/worldwave/abc/popup/abc120528.html などでも日本語を //div[@class=\"paragraph clearfix\"]//p[@class=\"ja\"]/text() のようなxPathで取得すると文字化けして出てきます。 mb_convert_encoding($html, "UTF-8", "Shift-JIS")のようにしてもダメです。 どのようにすれば解決するのでしょうか? アドバイスを頂けないでしょうか?

    • ベストアンサー
    • PHP
  • スクレイピングPHPにおける複数spanについて

    外部のホームページのソースを拾いRSS化するPHPを作成しました。 ***************************************** 外部ホームページ http://hoge.com/index.html ***************************************** <html> <table class="Table100"> <tr> <th class="Name"><h1>えんどう豆</h1></th> <td class="Price">254</td> <td class="maker"> <span class="a1">メーカー</span> <span class="a2">遠藤農園</span> </td> </tr> </table> </html> ***************************************** スクレイピングPHP http://hagedebu.jp/index.php  ***************************************** <?php class SimpleXMLExtended extends SimpleXMLElement { public function addCData($data) { $dom = dom_import_simplexml($this); $dom->appendChild($dom->ownerDocument->createCDATASection($data)); } } $xml = new SimpleXMLExtended('<rss version="2.0"></rss>'); $channel = $xml->addChild('channel'); $channel->addChild('title', 'TEST RSS'); $dom = new DOMDocument; @$dom->loadHTMLFile('http://hoge.com/index.html'); $xpath = new DOMXPath($dom); foreach ($xpath->query('//*[@class="Table100"]') as $node) { $item = $channel->addChild('item'); $item->addChild('description')->addCData(implode('<br>', [ $xpath->evaluate('string(.//*[@class="Name"]/h1)', $node), $xpath->evaluate('string(.//*[@class="Price"])', $node), $xpath->evaluate('string(.//*[@class="maker"]/span)', $node), ])); } header('Content-Type: application/xml; charset=utf-8'); $xml->asXML('php://output'); ************************************************ 問題点 このPHPでは、 えんどう豆 254 メーカー と表示されてしまいます。 <td class="maker"> <span class="a1">メーカー</span> <span class="a2">遠藤農園</span> </td> class="makerに複数のspanが入っているため、2つめのspanを認識しません。 当方が表示させたいのは下記のようにspanを両方とも表示させたいです。 またはひとつしか表示させることができない場合は、「メーカー」ではなく「遠藤農園」を優先表示させたいです。 このように表示させるためにはどうすればよいでしょうか? 希望表示 えんどう豆 254 メーカー 遠藤農園 または えんどう豆 254 遠藤農園 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • スクレイピングで取得した文字を変数表示

    javascriptでiphoneアプリを作成中です。 ゲームにあたり、自社サーバーのhoge.ne.jp/read1000.php上のデータベース 情報をスクレイピンクしてiphone上で表示させます。 下記により、「hoge.ne.jp/read1000.php」にあるソースの中から 「吉本」の文字をスクレイピング表示することが可能です。 ****【hoge.ne.jp/read1000.php】(DBサーバー)********************        <td class="class3_sql_name">吉本</td> ****【hogehoge.com/index.html】(iphone仮想サーバー)**************   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script type="text/javascript" src="./js/jquery.xdomainajax.js"></script> <script> url = 'http://hoge.ne.jp/read1000.php'; $.get(url, function(data){ var content3_sql_name = $(data.responseText).find('.class3_sql_name').text(); $("#text3_sql_name").text(content3_sql_name); }); </script> <div id="text3_sql_name"></div>  //←この部分にhoge.ne.jpからスクレイピング                       した吉本の文字が表示される ************************************************************ やりたいこと ここで取得できた「吉本」の文字を変数としてjavascript上で表示させたいと考えています。 下記のようにしたのですがグローバル変数、ローカル変数とも表示出来ません。 どうすれば表示できるでしょうか? ****【hogehoge.com/index.html】(iphone仮想サーバー)************* <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script type="text/javascript" src="./js/jquery.xdomainajax.js"></script> <script> url = 'http://hoge.ne.jp/read1000.php'; $.get(url, function(data){ var content3_sql_name = $(data.responseText).find('.class3_sql_name').text(); $("#text3_sql_name").text(content3_sql_name); //テスト用としてグローバル変数追加 content3=$("#text3_sql_name").text(content3_sql_name); }); </script> <script> document.write(""+content3_sql_name+""); </script> <script> document.write(""+content3+""); </script>  ↑上記のふたつとも表示出来ない 宜しくお願い致します。

  • objective-Cについてご相談があります。

    現在objective-cを勉強中なのですが、 jsonについて教えて頂きたい事があります。 jsonのファイル・データ・オブジェクトそれぞれを 取得する必要があると習ったのですが、それらの違いが 今ひとつ分かりません。 下記のような記述なのですが、それぞれの違いをどなたか ご教示頂けないでしょうか。 // 対象Jsonファイル取得 NSBundle *bnd = [NSBundle mainBundle]; NSString *ptn = [bnd pathForResource:@"Test01" ofType:@"json"]; NSURL *url = [NSURL fileURLWithPath:ptn]; // Jsonオブジェクトの取得 NSURLRequest *req =[NSURLRequest requestWithURL:url]; NSData *dat = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil]; // Jsonデータの取得 NSDictionary *dick01 = (NSDictionary *) [NSJSONSerialization JSONObjectWithData:dat options:NSJSONReadingMutableContainers error:nil]; 以上、何卒宜しくお願い致します。

専門家に質問してみよう