none
C#でWebページにアクセスする方法を教えてください。 RRS feed

  • 質問

  • いつもお世話になります。
    C#でWebページにアクセスする方法を教えてください。
    かなり深いのですが、次のような構造のWebページにアクセスしようとしています。
    usernameが、すでに存在する文字列「半沢直樹」の場合の、commentを抜き出そうとしています。

    <html>
    <body>
      <div>
        <div>
          <div>
            <div class="main">
              <div>
                <h5 >
                  <div >
                    <a href="username.html">username</a>
                  </div>
                </h5>
                <form>
                  <div>
                    <span>
                      <span>
                        <a href="comment" data-reactid="">comment</a>
                      </span>
                    </span>
                  </span>
                  </div>
                </form>
              </div>
            </div>
          </div>
        </div>
      </div>
    </body>
    </html>

    じっさいのページは、いちばん外側の<div>~</div>を複数もっています。

    <html>
    <body>
      <div>
        <div>
          <div>
            <div class="main">
              <div>
                <h5 >
                  <div >
                    <a href="username.html">半沢直樹</a>
                  </div>
                </h5>
                <form>
                  <div>
                    <span>
                      <span>
                        <a href="comment" data-reactid=".r[qyi9]">倍返しだ</a>
                      </span>
                    </span>
                  </span>
                  </div>
                </form>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div>
        <div>
          <div>
            <div class="main">
              <div>
                <h5 >
                  <div >
                    <a href="username.html">浅野支店長</a>
                  </div>
                </h5>
                <form>
                  <div>
                    <span>
                      <span>
                        <a href="comment" data-reactid=".r[quep7]">君の責任だ</a>
                      </span>
                    </span>
                  </span>
                  </div>
                </form>
              </div>
            </div>
          </div>
        </div>
      </div>
    </body>
    </html>

    現在、DocumentCompletedイベントで、

    HtmlElementCollection collections = webBrowser.Document.GetElementsByTagName("div");
    foreach (HtmlElement collection in collections) {
     //ここをどう書くか知りたい。
     string outerhtml = collection.OuterHtml;
     if (outerhtml.Contains("半沢直樹"))
      MessageBox.Show(outerhtml);
    }

    として抜き出しています。
    これで抜き出せているといえばいえるのですが、ご覧のようにdivの構造が深いため、同じキーワードを何度も抜き出してしまっています。
    いちど、
    HtmlElementCollection collections = webBrowser.Document.GetElementsByTagName("div");
    foreach (HtmlElement collection in collections) {
     HtmlElementCollection subcollections = collection.GetElementsByTagName("div");
    }
    のように、階層をたどって子項目を取得できれば、とも思ったのですが、そのようなことができるのかどうかわかりません。
    インテリセンスではだめみたいでした。
    このような場合、どのように取り扱ったらよいのかをご教示ください。

    2013年8月5日 11:36

すべての返信

  • GetElementsByTagName を div 要素で取るのは何か理由があるのですか? a 要素で取れないのですか?
    2013年8月5日 23:13
  • documentオブジェクトやgetElementsByTagName()メソッドなどはDOMで規定されていて、WebBrowserコンポーネントもこれに準じています。C#でどう実現するかよりもDOMでどう操作するかになります。DOMは一般的にはWebブラウザー内のJavaScriptでよく操作されるため、そちらの環境でまず練習することをお勧めします。
    2013年8月6日 4:31
  • a要素でとってみます。
    2013年8月6日 6:01