从HTML子类中获取数据

时间:2012-07-23 15:44:35

标签: c# html

我正在尝试使用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个“正确”类,因此无法按预期工作。

我试过通过className =“detailsinfo”进行搜索,我可以找到,但我不知道如何才能进入“正确”的课程。我试过兄弟姐妹和孩子,但结果似乎没有起作用。下一个可能的问题是,日期数据实际上是属于“右”类的文本,而不是“提交的日期”元素。

所以基本上,我很好奇如何获得我正在寻找的数据的最佳方法。我是否需要获取所有类“正确”的文本,然后尝试提取日期字符串?

如果信息太多或信息不足,请道歉:)提前致谢!

编辑:添加了如何使用C#调用GetElementsByTagName - 根据Icarus的评论。

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

1 个答案:

答案 0 :(得分:1)

如果你想要的'正确'实例是第二个,这将会这样做。给出了两种方法:

注释掉的方法是基于零,所以使用实例1。   第二种方法是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;

}