【问题标题】:Html Agility Pack Loop Through Table - Get cell value based on previous cell valueHtml Agility Pack Loop Through Table - 根据先前的单元格值获取单元格值
【发布时间】:2017-07-13 21:31:35
【问题描述】:

我有多个表,位置值以不同的索引顺序给出。 如果我循环遍历表时先前的单元格字符串是“位置”,我如何获取位置值。在下面的示例中,它是单元格 [7],但在其他表上它将是 9。如何在单元格内部文本为“位置”后有条件地获取值?基本上找到单元格“位置”获取下一个单元格的内部文本。

HTML 表格:

<table class="tbfix FieldsTable"">
<tbody>
    <tr>
        <td class="name">Last Movement</td>
        <td class="value">Port Exit</td>
    </tr>
    <tr>
        <td class="name">Date</td>
        <td class="value">26/06/2017 00:00:00</td>
    </tr>
    <tr>
        <td class="name">From</td>
        <td class="value">HAMBURGE</td>
    </tr>
    <tr>
        <td class="name">Location</td>
        <td class="value">EUROGATE  HAMBURG</td>
    </tr>
    <tr>
        <td class="name">E/F</td>
        <td class="value">E</td>
    </tr>
</tbody>

控制器循环:

foreach (var eachNode in driver.FindElements(By.XPath("//table[contains(descendant::*, 'Last Movement')]")))
                {
                    var cells = eachNode.FindElements(By.XPath(".//td"));
                    cd = new Detail();

                    for (int i = 0; i < cells.Count(); i++)
                    {
                        cd.ActionType = cells[1].Text.Trim();
                        string s = cells[3].Text.Trim();
                        DateTime dt = Convert.ToDateTime(s);
                        if (_minDate > dt) _minDate = dt;
                        cd.ActionDate = dt;

                    }
                }

【问题讨论】:

    标签: c# selenium-webdriver web-scraping phantomjs html-agility-pack


    【解决方案1】:

    在你的 foreach 循环中你可以使用这个:

    var location = eachNode.FindElement(By.XPath(".//td[contains(text(),'Location')]/following-sibling::td));
    

    【讨论】:

      【解决方案2】:

      假设你的数据总是这样的结构,我会遍历所有标签并将数据添加到字典中。

      试试这样的:

      Dictionary<string,string> tableData = new Dictionary<string, string>();
      var trNodes = eachNode.FindElements(By.TagName("tr"));
      
      foreach (var trNode in trNodes)
      {
          var name = trNode.FindElement(By.CssSelector(".name")).Text.Trim();
          var value = trNode.FindElement(By.CssSelector(".value")).Text.Trim();
      
          tableData.Add(name,value);
      }
      
      var location = tableData["location"];
      

      您必须为字典和结构添加验证和检查,但这是一般的想法。

      【讨论】:

        猜你喜欢
        • 2013-05-04
        • 1970-01-01
        • 2012-09-08
        • 2021-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        相关资源
        最近更新 更多