Html Agility Pack Loop Through Table - Obtener valor de celda basado en el valor de celda anterior

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

Pregunta

Tengo varias tablas y el valor de ubicación se da en orden de índice diferente. ¿Cómo puedo obtener el valor de ubicación si la cadena de celda anterior es "Ubicación" cuando recorro la tabla? En el siguiente ejemplo, se trata de celdas [7], pero en otra tabla, será 9. ¿Cómo puedo obtener valores de forma condicional después de que las celdas contengan el texto "Ubicación"? Básicamente, busque la celda "Ubicación" y obtenga el texto interno de la siguiente celda.

Tabla de 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>

Controlador de bucle a través:

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;

                    }
                }

Respuesta aceptada

En tu bucle foreach podrías usar esto:

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

Respuesta popular

Suponiendo que sus datos siempre estén estructurados de manera que repasaría todas las etiquetas y agregaría los datos a un diccionario.

Intenta algo como esto:

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

Tendría que agregar validación y verificaciones para el diccionario y la estructura, pero esa es la idea general.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow