c# - leyendo HTML?

Estoy desarrollando un programa en C# y necesito ayuda. Estoy tratando de crear una matriz o una lista de elementos que se muestran en un sitio web determinado. Lo que intento hacer es leer el texto de anclaje y es href. Entonces, por ejemplo, este es el HTML:

<div class="menu-1">
    <div class="items">
        <div class="minor">
            <ul>
                <li class="menu-item">
                    <a class="menu-link" title="Item-1" id="menu-item-1"
                    href="/es/?item=1">Item 1</a>
                </li>
                <li class="menu-item">
                    <a class="menu-link" title="Item-1" id="menu-item-2"
                    href="/es/?item=2">Item 2</a>
                </li>
                <li class="menu-item">
                    <a class="menu-link" title="Item-1" id="menu-item-3"
                    href="/es/?item=3">Item 3</a>
                </li>
                <li class="menu-item">
                    <a class="menu-link" title="Item-1" id="menu-item-4"
                    href="/es/?item=4">Item 4</a>
                </li>
                <li class="menu-item">
                    <a class="menu-link" title="Item-1" id="menu-item-5"
                    href="/es/?item=5">Item 5</a>
                </li>
            </ul>
        </div>
    </div>
</div>

Así que de ese HTML me gustaría leer esto:

string[,] array = {{"Item 1", "/?item=1"}, {"Item 2", "/?item=2"},
    {"Item 3", "/?item=3"}, {"Item 4", "/?item=4"}, {"Item 5", "/?item=5"}};

El HTML es un ejemplo que había escrito, el sitio real no se ve así.

preguntado el 22 de mayo de 12 a las 21:05

¿Intentó echar un vistazo a la secuencia XmlTextReader? Atraparás todos los a y, además, es rápido incluso con un gran archivo XML. -

Echa un vistazo a HtmlAgilityPack -

4 Respuestas

Como otros dijeron, HtmlAgilityPack es el mejor para el análisis de html, también asegúrese de descargar HAP Explorer del sitio de HtmlAgilityPack, utilícelo para probar sus selecciones, de todos modos, este comando SelectNode obtendrá todos los anclajes que tienen ID y comienza con el elemento del menú:

  HtmlDocument doc = new HtmlDocument();
  doc.Load(htmlFile);
  var myNodes = doc.DocumentNode.SelectNodes("//a[starts-with(@id,'menu-item-')]");
  foreach (HtmlNode node in myNodes)
  {
    Console.WriteLine(node.Id);

  }

contestado el 22 de mayo de 12 a las 21:05

¿El explorador HAP? De dónde sacas eso ? - paul1923

Si el HTML es un XML válido, puede cargarlo usando el XmlDocument class y luego acceda a las piezas que desee usando XPaths, o puede usar y XmlReader como sugiere Adriano (un poco más de trabajo).

Si el HTML no es XML válido, sugeriría usar algunos analizadores de HTML existentes; consulte, por ejemplo este - Eso funcionó bien para nosotros.

contestado el 22 de mayo de 12 a las 21:05

También puedes utilizar la HTMLAgilidad paquetes

contestado el 22 de mayo de 12 a las 21:05

Creo que este caso es lo suficientemente simple como para usar una expresión regular, como <a.*title="([^"]*)".*href="([^"]*)":

string strRegex = @"<a.*title=""([^""]*)"".*href=""([^""]*)""";
RegexOptions myRegexOptions = RegexOptions.None;
Regex myRegex = new Regex(strRegex, myRegexOptions);

string strTargetString = ...;

foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    // Use the groups matched
  }
}

contestado el 22 de mayo de 12 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.