Html Agility Pack Loop Through Table - получить значение ячейки на основе предыдущего значения ячейки

c# html-agility-pack phantomjs selenium-webdriver web-scraping

Вопрос

У меня несколько таблиц, а значение Location указано в разных порядковых номерах. Как я могу получить значение местоположения, если предыдущая строка ячейки - это «Местоположение», когда я просматриваю таблицу. В приведенном ниже примере это ячейки [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;

                    }
                }

Принятый ответ

В вашем цикле foreach вы можете использовать это:

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

Популярные ответы

Предполагая, что ваши данные всегда структурированы так, я бы перебирал все теги и добавлял данные в словарь.

Попробуйте что-то вроде этого:

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"];

Вам нужно будет добавить проверку и проверку словаря и структуры, но это общая идея.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow