Obtener primera y segunda celda de cada fila de la tabla HTML

.net html-agility-pack xpath

Pregunta

Estoy tratando de obtener solo algunas celdas específicas en cada fila usando HTMLAgilityPack.

foreach (HtmlNode row in ContentNode.SelectNodes("descendant::tr"))
{
    //Do something to first cell
    //Do something to second cell
}

Hay más células, y cada célula necesita algún tratamiento especializado. Supongo que hay una manera de hacer esto usando XPath, pero soy bastante inútil en eso. Hay tal vez algo como

var cell1 = row.SelectSingleNode("descendant::td:first");

Respuesta aceptada

Para obtener cada primera celda que sea un hijo de una fila, puede hacer lo siguiente:

// from row
var firstCell = row.SelectSingleNode("td[1]");

// each first cell in a table (note: tbody is not always there)
var allFirstCells = table.SelectNodes("tbody/tr/td[1]");

En otras palabras, use corchetes y el número de celda que desea seleccionar. Una excepción es la última celda, que puede obtener usando last() siguiente manera:

// from row
var lastCell = row.SelectSingleNode("td[last()]");

// each last cell in a table
var allLastCells = table.SelectNodes("tbody/tr/td[last()]");

Si desea obtener la celda junto a una celda actual, puede hacer algo como esto:

// from row
var firstCell = row.SelectSingleNode("td[1]");
var siblingCell = firstCell.SelectSingleNode("./following-sibling::td");

Es posible que desee verificar los valores de retorno en nulo, lo que significa que tiene un error tipográfico o que el árbol DOM que cargó no contiene la celda que solicitó.


Respuesta popular

En lugar de

descendant::tr

uso :

descendant::tr/td[not(position() >2)]


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué