2

我正在尝试用 C# 创建一个工具,用于收集和分析来自网页/表单的数据。基本上有两种不同类型的数据。用户输入的数据和系统创建的数据(我无权访问)。

用户创建的数据保存在字段中,表单使用 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

如果您想要的“正确”实例是第二个,这将做到这一点。给出了两种方法:

注释掉的方法是从零开始的,所以使用实例 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;

}
于 2012-07-23T16:11:32.390 回答