Dificultad para seleccionar los nodos con Html Agility Pack

c# html html-agility-pack

Pregunta

Tengo el diseño HTML actual

<table> //table[1]
</table>
<table> //table[2]
<tbody>
   <tr>
      <td>
         <p>
            &nbsp;
         </p>
      </td>
   </tr>
   <tr>
      <td>
         <table> //table[1]//table[1]
            <tbody>
               <tr>
                  <td>
                     <p>
                        INFO 1
                     </p>
                  </td>
                  <td>
                     <p>
                        INFO 2
                     </p>
                  </td>
                  <td>
                     <p>
                        INFO 3
                     </p>
                  </td>
                  <td>
                     <p>
                        INFO 4
                     </p>
                  </td>
               </tr>
            </tbody>
         </table>
      </td>
   </tr>
   <tr>
      <td>
         <table> //table[1]//table[2]
            <tbody>
               <tr>
                  <td>
                     <p><strong>Name</strong></p>
                  </td>
                  <td>
                     <p><strong>Quantity</strong></p>
                  </td>
               </tr>
               <tr>
                  <td>
                     <p>Apples </p>
                  </td>
                  <td>10</td>
               </tr>
            </tbody>
         </table>
      </td>
   </tr>
   <tr>
      <td>
         <table>  //table[1]//table[3]
         </table>
      </td>
   </tr>
</tbody>
</table>

Estoy tratando de obtener los datos dentro de //table[1]//table[2] , pero sigo obteniendo un HtmlNode nulo ( System.NullReferenceException ) para lo siguiente:

no funciona: doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[2]//tbody//tr"); ,

No estoy seguro de por qué ocurre esto ya que cuando trato de obtener datos para //table[1]//table[1] funciona bien con esta sintaxis

works: doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[1]//tbody//tr");

¿Estoy malinterpretando cómo funciona la indexación con Html Agility Pack?

Respuesta aceptada

//table[2] devuelve el elemento 2nd <table> dentro del mismo padre porque en XPath:

El ( [] ) tiene una prioridad (prioridad) más alta que ( // y / ). [ Para referencia ]

En su caso, solo hay una <table> en cada <td> , por lo tanto, la expresión Xpath no devolvió nada. Una posible solución es poner corchetes para alterar la prioridad:

(//table[2]//tbody//tr//td//table)[2]//tbody//tr

Por encima de Xpath, obtenga el segundo elemento <table> de todas las <table> devueltas por la //table[2]//tbody//tr//td//table interna XPath //table[2]//tbody//tr//td//table . Luego, desde esa <table> , continúe devolviendo los descendientes //tbody//tr elementos.


Respuesta popular

Terminé teniendo que basarme en esto. tr no estoy seguro de por qué mi otra forma no funcionó, pero esta manera sí funciona.

Básicamente moví mi indexación al siguiente nivel por encima de mi mesa. Entonces, dentro del primer tbody cada tabla a partir de entonces está dentro de una sentencia tr / td, y simplemente construí mi HtmlNode para indexar fuera de los tr 's. ¿Tal vez Agility Pack funcione mejor si amplías el proceso de selección? IDK.

De todos modos ...

Para la table[2]//table[1] utilicé:

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[2]//table");
foreach (var cell in table.SelectNodes(".//tr//td/p"))
...

Seleccioné tr [2] porque tenía un tr / td antes con un espacio en blanco si nota el ejemplo HTML anterior

Para la table[2]//table[2] usé

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[3]//table[1]");
foreach (var cell in table.SelectNodes(".//tr//td"))
...

Para cualquier persona que tenga problemas, intente mover su búsqueda a una selección más amplia presionando etiquetas específicas a etiquetas más amplias.




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é