2012-07-23 136 views
2

我正在嘗試在C#中創建一個工具,該工具收集並分析網頁/表單中的數據。基本上有兩種不同類型的數據。用戶輸入的數據和系統創建的數據(我無權訪問)。從HTML子類中獲取數據

用戶創建的數據保存在字段中,表單使用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(搜索「格」),然後使用的getAttribute(「類名」)(搜索「右」)產生了一定的效果,但有2個「權」類,它不按預期工作。

我試過通過className =「detailsinfo」進行搜索,我可以找到它,但我不知道如何才能進入「正確」類。我嘗試了兄弟姐妹和孩子,但結果似乎沒有奏效。下一個可能的問題是,日期數據實際上是屬於「右」類的文本,而不是「提交日期」的元素。

所以基本上,我很好奇最好的方法是如何獲得我正在尋找的數據。我是否需要獲得所有類的「正確」文本,然後嘗試提取日期字符串?

道歉,如果有太多的信息或沒有足夠的所需的信息:)提前致謝!

編輯:添加如何使用C#調用GetElementsByTagName - 根據Icarus的評論。

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

目前尚不清楚如何你使用C#調用'getElementsByTagName'。 – Icarus 2012-07-23 15:48:33

回答

1

這將做到這一點,如果你想要的'正確'的實例是第二個。兩種方法給出:

被註釋掉的方法是它從零開始,因此使用實例1 第二種方法是XPath的,因此是一個基於這樣使用實例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; 

} 
+0

謝謝你的回答,tom_yes_tom!不幸的是,正如Icarus指出的那樣,我並不清楚我是如何調用getElementsByTagName。也許'形式'是不正確的術語('形式'是我們在工作中使用的術語)。數據完全存放在網頁(HTML)中。要使用你的代碼,它需要XML - 是的,我嘗試了HTML,但X和HT只是不相處:)。雖然我必須說,看起來XML的數據收集方法比HTML好得多。 – AlexH 2012-07-24 03:00:28

+0

啊。太糟糕了。在這種情況下,如果您提供了完整的html,那將是最好的。如果html也是格式良好的xml,上面的代碼仍然可以工作。如果沒有,如果你可以抓住你在這裏包括的片段,只是用你的div它會起作用。有時候只需稍微調整就可以使用html並使其成爲有效的xml。 (有時不) – 2012-07-24 12:30:31