Obtener celda de tabla anidada con HtmlAgilityPack

c# html-agility-pack html-parsing

Pregunta

Tengo la siguiente página html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>

<head>
</head>

<body>
<div style="LEFT: 135; WIDTH: 450; POSITION: absolute; TOP: 70">
  <a name="content_begins"></a>
  <table cellSpacing="0" cellPadding="0" width="100%" border="0">
    <tr>
      <td vAlign="top">
      <table class="PortalGadget" cellSpacing="0" cellPadding="0" width="100%" border="0">
        <tr>
          <td>
          <table cellSpacing="6" cellPadding="0" border="0">
            <form name="authenticator" ACTION="auth-cup" METHOD="POST" ENCTYPE="application/x-www-form-urlencoded">
              <tr bgColor="#6c8899">
                <td><font face="Trebuchet MS" color="#ffffff">&nbsp;*** You Have Already Logged In ***</font></td>
              </tr>

              <tr height="20">
                <td vAlign="bottom" height="20">
                <font face="Trebuchet MS" size="-1">Context:</font></td>
              </tr>
              <tr>
                <td></td>
              </tr>
              <tr>
                <td vAlign="bottom" height="20">
                <font face="Trebuchet MS" size="-1">Username:</font></td>
              </tr>
              <tr>
                <td><input size="40" name="username"></td>
              </tr>
              <tr>
                <td><font face="Trebuchet MS" size="-1">Password:</font></td>
              </tr>
              <tr>
                <td><input type="password" size="40" name="password"></td>
              </tr>
              <tr>
                <td vAlign="bottom" height="20">
                <font face="Trebuchet MS" size="-1">Destination:</font></td>
              </tr>
              <tr>
                <td>
                <input size="40" name="url" value="http://ya.ru/"></td>
              </tr>
              <tr>
                <!---- Hidden field to identify forward/reverse proxy path ------>
                <input TYPE="hidden" NAME="proxypath" VALUE="forward">
              </tr>
              <tr>
                <td vAlign="bottom" align="left">
                <input type="submit" alt="Login" value="Login" border="0" name="loginButton">&nbsp;&nbsp;
                <input type="reset" alt="Reset" value="Reset"></td>
              </tr>
              <tr height="5">
                <td height="5"><hr SIZE="2"></td>
              </tr>
              <tr>
                <td><font face="Trebuchet MS" size="-1">
                <p>Copyright 1999-2003 Novell, Inc. All rights reserved.</p>
                </font></td>
              </tr>
            </form>
            </tbody>
          </table>
          </td>
        </tr>
      </table>
      </td>
    </tr>
  </table>
</div>
</body>
</html>

Quiero obtener el texto "Ya has iniciado sesión" de td. Tengo este codigo

Stream str = SendData().GetResponseStream();
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.Load(str);
            foreach (HtmlAgilityPack.HtmlNode table in doc.DocumentNode.SelectNodes("//table[@class='PortalGadget']"))
            {
                MessageBox.Show("Found: " + table.Id);
                foreach (HtmlAgilityPack.HtmlNode row in table.SelectNodes("//table"))
                {

                    HtmlAgilityPack.HtmlNodeCollection cells = row.SelectNodes("tr");

                    if (cells == null)
                    {
                        continue;
                    }

                    foreach (HtmlAgilityPack.HtmlNode cell in cells)
                    {
                        MessageBox.Show("cell: " + cell.InnerText);
                    }
                }
            }

Pero no puedo obtener el texto "Ya has iniciado sesión" en el código. ¿Cómo obtener valores de celdas de tablas anidadas en este escenario?

Respuesta aceptada

Hmmm me encontré solución me parece:

string value = doc.DocumentNode.SelectNodes("//table[@class='PortalGadget']/tr/td/table/tr/td")[0].InnerText;

Respuesta popular

Para seleccionar Nodos de otro Nodo tienes que poner un '.' al inicio de la XPath.

Entonces table.SelectNodes("//table") convierte en table.SelectNodes(".//table")



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é