2

Web ページ/フォームからデータを収集して分析するツールを C# で作成しようとしています。基本的に 2 種類のデータがあります。ユーザーが入力したデータとシステムによって作成されたデータ (アクセス権がありません)。

ユーザーが作成したデータはフィールドに保持され、フォームは ID を使用するため、GetElementByID が使用されます。私が直面している問題は、システムによって作成されたデータを取得することです。フォームには表示されますが、ID には関連付けられていません。HTML の読み取り/解釈が間違っている可能性がありますが、子クラスのようです (HTML の経験があまりありません)。「提出日」データ (コードの下部近く) を取得しようとしています。HTML コードのサンプル:

<div class="bottomSpace">
    <div class="importfromanotherorder">
        <div class="level2Panel" >

           <div class="left">
                <span id="if error" class="error"></span>
             </div>

           <div class="right">
                Enter Submission ID
                <input name="Submission$ID" type="text" id="Submission_ID" class="textbox" />
                <input type="submit" name="SumbitButton" value="Import" id="SubmitButton" />
            </div>
        </div>
    </div>
</div>

<div class="bottomSpace">
    <div class="detailsinfo">
        <div class="level2Panel" >

        <div class="left">
                <h5>Product ID</h5>
                1234567
                <h5>Sub ID</h5>
                Not available
                <h5>Product Type</h5>
                Type 1
        </div>

        <div class="right">
                <h5>Order Number</h5>
                0987654
              <h5>Status</h5>
                Ordered
                <h5>Date Submitted</h5>
                7 17 2012 5 45 09 AM
            </div>
        </div>
    </div>
</div>

GetElementsByTagName (「div」を検索) を使用してから GetAttribute(「className」) (「right」を検索) を使用すると、いくつかの結果が生成されますが、2 つの「right」クラスがあるため、意図したとおりに機能しません。

className = “detailsinfo” で検索してみましたが、見つけることができましたが、「正しい」クラスにたどり着く方法がわかりません。私は兄弟と子供を試しましたが、結果は機能していないようです. 次に考えられる問題は、日付データが実際にはクラス「right」に属するテキストであり、要素「Date Submitted」ではないように見えることです。

つまり、基本的には、探しているデータを取得するための最良の方法がどのようになるかについて興味があります。クラスの「正しい」テキストをすべて取得してから、日付文字列を抽出する必要がありますか?

情報が多すぎたり、必要な情報が十分でない場合はお詫び申し上げます:) よろしくお願いします!

編集: C# を使用して GetElementsByTagName を呼び出す方法を追加しました - Icarus のコメントに従って。

HtmlDocument doc = webBrowser1.Document;
HtmlElementCollection elemColl = doc.GetElementsByTagName("div");
4

1 に答える 1

1

これは、必要な「正しい」インスタンスが 2 番目の場合に実行されます。与えられた2つのアプローチ:

コメントアウトされたアプローチはゼロベースであるため、インスタンス 1 を使用します。2 番目のアプローチは xpath であり、したがって 1 ベースであるため、インスタンス 2 を使用します。

private string ReadHTML(string html)
{

  System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
  doc.LoadXml(html);
  System.Xml.XmlElement element = doc.DocumentElement;

  //This commented-out approach works and might be preferred if you want to iterate
  //over a node set instead of choosing just one node
  //string key = "//div[@class='right']";
  //System.Xml.XmlNodeList setting = element.SelectNodes(key);
  //return setting[1].LastChild.InnerText;

  // This xpath appraoch will let you select exactly one node:
  string key = "((//div[@class='right'])[2])/child::text()[last()]";
  System.Xml.XmlNode setting = element.SelectSingleNode(key);
  return setting.InnerText;

}
于 2012-07-23T16:11:32.390 に答える