• ベストアンサー

AJAXを使用したサイトに対するgetelementsbytagname("td")について

プログラミング初心者です。 fifiaのランキングのページ(http://www.fifa.com/worldfootball/ranking/lastranking/gender=m/fullranking.html)を対象にして、スクレイピングを行おうとし、 require("win32ole") ie =WIN32OLE.new("InternetExplorer.Application") でIEオブジェクトを取得し、 ie.visible =true ie.Navigate("http://www.fifa.com/worldfootball/ranking/lastranking/gender=m/fullranking.html") while ie.busy == true sleep 0.1 end ここまではいいのですが、表の中の値を取得しようと ie.document.getelementsbytagneme("td") を実行してみてもnilが帰ってきてしまいます。 HTMLのソースを表示してみても<td>タグは含まれているはずなのですが、試しにie.document.getelementsbytagname("td").lengthを実行してみると0が返ってきてしまい、どうしたらいいのかさっぱりわからない状態です。 ie.document.getelementsbytagname("div")などはちゃんと機能するので、おそらく問題の原因は<td>タグがAJAX.updaterメソッドを使ったページの内容更新の対象となっていることだと思うのですが、いかんせん不勉強で解決方法がわかりません。 どなたか詳しい方、ご教授していただけないでしょうか。

  • Ruby
  • 回答数2
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4851/10265)
回答No.2

何度かやってみましたが、 p ie.document.getelementsbytagname("td").length で、305が表示されますね。 WinXP ProSP3+IE7です。 あと、スクレイピングであれば、rubygemsのmechanizeを使ってみてはどうでしょう?

zabiora
質問者

お礼

今日改めて挑戦したら、なぜだか成功しました。 未だに昨日失敗した原因は分かりませんが、、、 rubygemsも活用していけるようにしていきたいです。

zabiora
質問者

補足

>何度かやってみましたが、 >p ie.document.getelementsbytagname("td").length >で、305が表示されますね。 そうですか…。自分はVista+IE7なのですが、ますます原因が分からなくなってしまいましたね…。 色々さらに調べてみることにします。

その他の回答 (1)

noname#149362
noname#149362
回答No.1

外しているかも知れませんが、getelementsbytagneme ではなくて getelementsbytagname では? (neme → name)

zabiora
質問者

補足

すいません、ただの転記ミスです。 誤解を招いてしまってすいません。

関連するQ&A

  • javascriptでtdのサイズを取得するには?

    javascriptで、tableのあるtdタグの高さ(height)を 取得したいのですが、どうやればいいですか? 例: <table><tr> <td id="tdtest">aaaa</td> <td >bbb</td></tr>・・・ とあった場合に、onLoadイベントで document.getElementById("tdtest").heightで やったのですが、エラーではなく空でした。 教えてください、お願いします。

  • Yahoo!ウィジェットのgetElementsByTagName

    Yahoo!ウィジェットについて質問です。 getElementsByTagNameで取得したタグのlenghtはかえってくるのですが, tagNameのデータを読み込もうすると、(TypeError: unit[0] has no properties)になります。 Yahoo!ウィジェットのgetElementsByTagNameは、通常のJavaScriptとは違うのでしょうか? コードは以下の通りです。 ■JavaScript //XMLHTTPRequest var request = new XMLHttpRequest(); request.autoRedirect = false; request.open( "GET", "hoge.xml", true ); request.send(); request.onreadystatechange = myStatusProc; //XMLデータの表示 function myStatusProc(){ if ( this.readyState == 4 ){ var XMLObj = request.responseXML; var unit = XMLObj.getElementsByTagName("unit"); var a = unit[0].getElementsByTagName("a")[0].firstChild.nodeValue; print(a); } } ■XML <root> <unit> <a>test</a> </unit> <unit> <a>test</a> </unit> <unit> <a>test</a> </unit> </root> すみません。よろしくお願いします。

  • フレーム内の値が取得できません。どうか助けて下さい↓

    javaScript初心者です。どうか教えて下さい。 ブラウザ:FireFox で画面を開き、DOMの構造を確認すると、以下の用になっています。(適所省略) 内容:フレームが3つ存在し、BodyFrameの中の値1を取得する為にはどのようにすればよろしいのでしょうか? いろいろ試行錯誤したのですが、フレームが見つからない旨のエラーが表示されてしまいます。 ※試したパターン var b = parent.BodyFrame.document.getElementsByTagName("TD").item(0); var b = BodyFrame.document.getElementsByTagName("TD").item(0); var b = BeginFrame.MainFrame.BodyFrame.document.getElementsByTagName("TD").item(0); var b = top.BodyFrame.document.getElementsByTagName("TD").item(0); var b = window.BodyFrame.document.getElementsByTagName("TD").item(0); Frame(BeginFrame) -Frame(MainFrame) -Frame(BodyFrame) <HTML> <head></head> <BODY> <table> <tr> <td>値1</td><td>値2</td><td>値3</td> </tr> <tr> <td>あああ</td><td>いいい</td><td>ううう</td> </tr> </table> </BODY> </HTML> いろいろ調べたのですが、お手上げです。どうかご教授下さい。

  • 複数タグ指定してHTMLを取得したい

    VBAでMSHTML.HTMLDocumentを使用してWEB上から指定したタグ内のテキストを取得しようとしているのですが、取得したいデータがタグが複数に分かれています。 divの特定クラス内だけなど取得したいのですが、データ1は<h1>データ2は<td>や<p>など、getElementsByTagName(tag)だと、一つしかタグを指定きず、個別に取得するとデータ1とデータ2の関連がバラバラになってしまう為、複数タグを指定して取得できる方法を探しています。 イメージとしてはgetElementsByTagName(tag).Lengthが10の時にh1のタグを発見してそこからh1のinnerTextとtdタグ2つ分のinnerText取得して、またh1タグを発見するまでループして取得するような形に出来ればと思っています。 自作する以外ないのでしょうか?

    • ベストアンサー
    • HTML
  • COMコンポーネントの構造の本質的理解ができない

    プログラミングを始めて間もない初心者です。 windowsアプリケーションを制御対象として扱おうと、win32oleライブラリをrequireしてCOMコンポーネントを扱う方法をネット上で色々調べてみたのですがどうも腑に落ちない点・分からない点があるので質問します。 rubyリファレンスマニュアルからリンクされているサイト(http://jp.rubyist.net/magazine/?0003-Win32OLE)において、以下のような記述があります。 >COM ではインスタンスを生成するときに「COM コンポーネント」を指 >定するための ProgID を引数として WIN32OLE.new メソッドを実行し >ます。 COM コンポーネントとは、Windows に登録された、ある機能 >(たとえば、IE や MS Office の制御機能) を提供するためのもので >す。この「COM コンポーネント」を利用して作成したインスタンス を>「COM オブジェクト」とこの記事では呼んでいます。 COM オブジェク>トを作成した後は、その COM オブジェクトで定義されている「メソッ>ド」を実行することでそのコンポーネントが提供する機能を実現する >ことができます。 この文に従えば、作成したCOMオブジェクトを扱う方法を知るためにはCOMオブジェクトで定義されているメソッドを参照すれば良いこととなります。そこで自分もWIN32OLE.new("InternetExplorer.Application") によって得たCOMオブジェクトにWIN32OLE.ole_methodsを適用することでメソッドの一覧を取得しましたが、前述のサイトで紹介されているie.document.all.Item()というメソッドを探してみてもどこにも見つかりません。 これはどういうことなのかと思い、ネット上で色々とCOMとは何か、タイプライブラリとは何かなどを調べて見ましたが、いまだCOMの全体像の把握ができません。 たとえばrubyの場合、あるオブジェクトに対して使えるメソッドというのはそのオブジェクトが該当するクラスに於いて定義されているメソッド((1))及びkernelモジュールで定義されている組み込みメソッド((2))ですよね。 (初心者なのでこの理解にも間違いがあるかもしれませんがその場合はご指摘お願いします) このような考え方でいくとWIN32OLE.ole_methodsによって取得したメソッドの一覧は(1)にあたり、document.all.Item()というのは(2)にあたるのではないかという考えもできるかと思うのですが誰か正しい理解をご教授いただきたいです。 質問が長くなってしまいましたがie.document.all.Item()というメソッドがどこに定義されているのか、そういったメソッドの定義場所はCOMにおいてどのように見つけるのか、そこだけでもいいのでよろしくお願いします。

    • ベストアンサー
    • Ruby
  • VBAオブジェクト変数またはWithブロック変数

    Access VBAについてお教えください。 VBAを使用しています。下記のようなコードでDOMの値を取得しようと思っています。 If IsNull(IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText) Or _ IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText = "" Then stocker = "" Else stocker = IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText End If IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText)にデータがある場合は、 問題なくstockerに値をセットすることができます。 ただし、IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText)にデータ(要素)が なにも無い場合は、エラーが発生します。 「実行時エラー91;オブジェクト変数またはWithブロック変数が設定されていません」 IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText)にデータが無い場合は、NULLが 帰ってくるとサイトで見かけたので、IF文を使って回避しようと思いましたが、成功しませんでした。 何が悪いと考えられるでしょうか?

  • WEBページの表のデータを取得

    外部にあるWEBページにある表のデータを取得したいのですが、色々調べてみましたが見つからなくて、ご存じの方教えてください! あるWEBページに表がいくつかあります。 その中の一つの表のデータが全部欲しいです。 その表のTableタグにはIDがふってあります。 その表を囲んだDIVタグにもIDがふってあります。 URLは固定です。 TDタグの全てにはClassタグが入っています。 VB2005を使っています。 どのようにすればいいか見当がつかなくて、これ↓を使えばいいのかなあというくらいしかわかりませんでした。。(泣) Document.Body.GetElementsByTagName() どうぞよろしくお願いいたします。

  • フレームを使ってるサイトはタグの取得はできない?

    フレームを使ってるサイトは、タグの取得はできないのでしょうか? vbaでieを操作をしていて、サイトにログイン後、 imgタグの中にあるaltの値を取得したいのですが、 For Each myObj In objIE.document.all.tags("img") Debug.Print myObj.alt Next これがスルーされてしまいます。 imgタグがいくつもあるのにスルーされてしまうし、imgタグだけでなくtdタグなどもすべてスルーされます。 その原因はサイトにフレームが使われてるからなのでしょうか? なぜか For Each myObj In objIE.document.all.tags("frame") Debug.Print myObj.Name Next なら値が取得できるんです。 For Each myObj In objIE.document.all.tags("form") Debug.Print myObj.Name Next はダメでした。 いつもなら、ソースにformタグがあれば、これで取得できるのですが・・・

  • tbody要素のinnerHTMLが書き換えられません

    こんにちは、教えてください。 <form1> <table id="test"> <tbod> <tr><td></td><tr> </tbody> </table> </form1> 例えばうえのような感じになっていたとき、 var tbody = document.getElementById( "test" ).getElementsByTagName( "tbody").item( 0 ); これでtbody要素が取得できると思います。 tbody.innerHTML += tbody.innerHTML; だけどうのようにすると【htmlfile:未知の実行時エラーです】となります。 document.getElementById( "test" ).innertHTML += document.getElementById( "test" ).innertHTML; という感じは一応動きます。なんででしょうか?

  • widthを指定しない<td>が幅をシェアする基準?

    <table>タグの表示不安定につき、ご教示ください。 aaaa.txtに蓄積したデータをCGIで切り分けて、下記の<table>タグ内に割り付けて 表示させています。 <table width=510> <tr><th>左列の表題</th> <th>右列の表題</th></tr> <tr><td>改行タグを含む文字列A1</td> <td>改行タグを含む文字列B1</td></tr> <tr><td>同様のA2</td><td>同様のB2</td></tr> <tr><td>同様のA3</td><td>同様のB3</td></tr> <!--このtrを繰返し--> </table> 表幅を絶対指定したのは、印刷時に 510 px / 72 dpi * 2.54 cm = 18 cmで、 A4の幅に納まりやすいだろうという意図です。文字列AとBは、それぞれ <br>で区切ってありますが、区切りは概ね1行分(はみだせば折り返し)です。 <td>の幅を指定しなかったのは、<br>までの長さに応じて表示幅をシェアさせ、 折り返し頻度を減らすこと(印刷時の縦長の節約)が目的です。 IE5/Win&Mac及びNN4.7/Win&Macで、td内の1行長を無視した割付けが しばしば生じ、その割付け方の法則がわかりません。小細工を諦めて、列幅を 50%ずつに指定してしまおうかとも思っていますが、ブラウザは何を基準に 列幅を割り付けているのでしょう? 要領を得ない状況説明で恐縮ですが、追加説明は補足要求でご指示ください。