Xpathがわからない。

capybaraとXpathを使ってrubyスクレイピングをしようとしています。 まず添付画像を御覧ください。 ゴール...

donttalktome さんからの 回答

  • 2019/03/11 08:07
  • 回答No.1
donttalktome

ベストアンサー率 90% (10/11)

XPath だと tr[contains(concat(' ',@class,' '),' checkdin ')]//img
CSS だと tr.checkdin img
くらいで検索して src を抜き出せば良いと思います。
capibara は nokogiri 使ってますよ。
この回答にこう思った!同じようなことあった!感想や体験を書こう!
この回答にはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
  • Nokogiriスクレイピングがうまくできない。 Ruby

    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初学者です。 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でそのまま表示する方法)があれば教えてください。...

  • 画像縮小プログラムが、最初に読み込んだ時(再読み込みしない場合)動きま... JavaScript

    今javascriptを使って、縦横比を固定したまま画像を縮小するプログラムを作っています。 ソースコードは function keep_max() { for (i in document.images) { if (document.images[i].className == 'small_sale_thumb') { max_width = 100 ; max_height = 110 ; }else { continue; } if ( document.images[i].height > max_height) { now_width = document.images[i].width; now_height = document.images[i].height; factor = max_height/now_height; document.images[i].height = max_height ; document.images[i].width = now_width * factor; } } } それで、このようにして画像を表示しようとします。 <img width="100" class="small_sale_thumb" src="http://hogehoge.co.jp/bc11/u3785993.jpg" /> <script type='text/javascript'> keep_max(); </script> このようにして、他のドメインのサイト(楽天など)の画像を読み込み、 縮小して表示しようとしているのですが、最初に読み込んだ場合、このプログラムが作動しません。 しかも何故か、二回目に読み込んだ場合(同じページを再読み込みした場合等)作動します。 これはいったいどういうことでしょうか? ちなみに今妥協策として、bodyのonloadタグにもこれを仕込んでいますが、この場合、画像表示から縮小までにタイムラグがあります。 このプログラムを上手く動かす方法or他のクライアントサイドでの縮小の仕方はありませんでしょうか?? ちなみに縮小したい画像の件数が多いので、負荷対策のためGD等のサーバーサイドでの縮小は考えないようにしています。...

  • c++でxpath指定でXML C・C++・C#

    c++でプログラミングを学んでいます。 XMLを使って設定ファイルを作ろうと思っています。 プログラム側で、あらかじめどのようなフォーマットのXMLかは知っているので、 ルートからのxpathを文字列で指定して要素を読みに行きたいのですが、 どのライブラリがこれを出来るのかわからない(1)、 また、サンプルが見付からない(2)、 ので困っています。 (1)と(2)について教えてください。★ (1)については、XercesとXalanとlibxml2が出来そう?、 (2)については直接指定のサンプルを全くみつけられていない、というところです。 (ソースコードについてくるサンプルでも直接指定は見つけられていなくて、複雑だと読めなくて困ってます。) (出来そうだという書き込みは、日本語圏・英語圏でちらほら見られる。) 因みに、boost::property_treeで読もうと思ったりしましたが、属性を検索キーにする必要があって、xpathが利用できないと複雑なプログラムを書かないとならないので、やめました。 そこまでするならXMLのフォーマットを変えよう→XMLの意味が無い→何としてもxpath、と…。 よろしくお願いします。...

  • リンクにマウスを重ねた際、テキストリンクと画像を同時に変更する方法など... HTML

    HTMLで数点詰まってしまった所がございましたので、ご教示いただける方がいらっしゃいましたら、よろしくお願いします。 【やりたいこと】 1. 「ここは1行目です。」というテキストと画像にリンクが貼ってあります。 そのどちらかにマウスを重ねた際、下記の3つを同時に変更したいのですが可能でしょうか? 1-1. 画像を変更する。 1-2. 「ここは1行目です。」の文字色を変更する。 1-3. 「ここは1行目です。」のtdの背景色を変更する。 今の所、1-1, 1-2はそれぞれの上にマウスを重ねると動作します。 1-3は上にマウスを重ねると文字の後ろのみ(tdの後ろではありません)背景が変わります。 ただしどれも連動はしていません。 2. 1-3の関連となりますが、現在、画像とテキストにリンクを貼っていますが、そうではなく列(またはテーブル)自体にリンクを貼る(リンクを1つにまとめる)ことは可能でしょうか? tableやtrにリンクを貼っても動作しなかったのですが、何か代替案があればご教示いただければと思います。 【ソースコード】 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <title>title</title> <style type="text/css"> <!-- .text_link a { display: block; } .text_link a:hover { color:#33FF66; background-color:#CCFFFF; } --> </style> <script type="text/JavaScript"> <!-- function MM_swapImgRestore() { //v3.0 var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc; } function MM_preloadImages() { //v3.0 var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array(); var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++) if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}} } function MM_findObj(n, d) { //v4.01 var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n]; for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); if(!x && d.getElementById) x=d.getElementById(n); return x; } function MM_swapImage() { //v3.0 var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3) if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];} } //--> </script> </head> <body onload="MM_preloadImages('images/5.jpg')"> <table border="0" cellspacing="0" cellpadding="0" width="300"> <tr> <td width="1" valign="middle"><a href="index1.html" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image3','','images/5.jpg',1)"><img src="images/1.jpg" name="Image3" width="80" height="60" border="0" id="Image3" /></a></td> <td valign="middle" class="text_link"><a href="index1.html">ここは1行目です。</a></td> </tr> </table> </body> </html> 【使用ファイル】 index.html(上記ソース) images/1.jpg(任意の画像) images/5.jpg(任意の画像) どこか一箇所でもご教示いただけるようでしたら、ご教示いただければと思います。 以上、よろしくお願いします。...

ページ先頭へ