HTML Agility Pack y LINQ

c# html-agility-pack linq web-scraping

Pregunta

Quiero usar HAP para raspar los datos de una tabla en un sitio web, recorrer las filas para encontrar un valor en una columna que coincida con una cadena predefinida y luego almacenar solo la fila que coincida. Luego tendré un diccionario con el encabezado de la columna como clave y el texto de la columna para la fila seleccionada como el valor.

Tabla ex.

<table id="Table3">
<tbody><tr><td></td></tr>
<tr>
<td>ID</td>
<td>Last Name</td>
<td>First Name</td>
<td>Birth Date</td>
<td>Relation</td>
</tr>

<tr>
<td>nbsp;01&nbsp;</td>
<td>&nbsp;DUNN          &nbsp;</td>
<td>&nbsp;JOE          &nbsp;</td>
<td>&nbsp;19931209&nbsp;</font></td>
<td>&nbsp;Son&nbsp;</td>
</tr>

<tr>
<td>nbsp;02&nbsp;</td>
<td>&nbsp;SMITH          &nbsp;</td>
<td>&nbsp;MARY          &nbsp;</td>
<td>&nbsp;19950206&nbsp;</font></td>
<td>&nbsp;Daughter&nbsp;</td>
</tr>

<tr>
<td>nbsp;03&nbsp;</td>
<td>&nbsp;ROCKFORD          &nbsp;</td>
<td>&nbsp;BILL          &nbsp;</td>
<td>&nbsp;20000320&nbsp;</font></td>
<td>&nbsp;Son&nbsp;</td>
</tr>

</tbody></table>

Si la fecha de mi DOB que quiero hacer coincidir es 20000320, entonces quiero toda la información sobre Bill.

Agregar los títulos de encabezado a la lista no es un problema. Sé que no tengo la fila del usuario escrita a la derecha. Lo que tengo todavía es intentar obtener una lista de filas en lugar de una fila. Otro problema que encuentro con la fila del usuario es que el texto interno volverá con "& nbsp" y no puedo hacer un .Remplazar, así que necesito una forma de eliminar los espacios. Estoy abierto a todas las sugerencias. Formas más inteligentes de hacer todo esto, etc.

List<string> headerList = new List<string>();
List<string> userList = new List<string>();

var htmlRows = htmlDoc.DocumentNode.SelectNodes("//*[@id=\"Table3\"]/tbody/tr");
if(htmlRows != null)
{
     // Add first row which contains column headings
     htmlRows[2]
         .Elements("td")
         .Select(td => td.InnerText.Trim())
         .ToList()
         .ForEach(header => headerList.Add(header));

     // Add user rows
     htmlRows
         .Skip(3)
         .Select(tr => tr.Elements("td")
             .Where(td => td.InnerText.Trim() == dteDOB))
             .ToList()
         .ForEach(row => userList.Add(row));

    for(int i = 0; i < headerList.Count; i++)
    {
        if(headerList.Count == userList.Count && userList[i] != null)
            dictValues.Add(headerList[i], userList[i]);                 
    }
}

Respuesta aceptada

puede intentar seleccionar todo tr utilizando el valor en td Creo

//*[@id=\"Table3\"]/tbody/tr[td//text()[contains(., 'targetString')]]

mira esto

XPath para seleccionar una fila de la tabla que tiene una celda que contiene el texto especificado



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é