HtmlAgilityPack que da problemas con html malformado

c# html-agility-pack

Pregunta

Quiero extraer texto significativo de un documento html y estaba usando html-agility-pack para el mismo. Aquí está mi código:

string convertedContent = HttpUtility.HtmlDecode(
    ConvertHtml(HtmlAgilityPack.HtmlEntity.DeEntitize(htmlAsString))
);

ConvertHtml:

public string ConvertHtml(string html)
{
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);

    StringWriter sw = new StringWriter();
    ConvertTo(doc.DocumentNode, sw);
    sw.Flush();
    return sw.ToString();
}

Convertir a:

public void ConvertTo(HtmlAgilityPack.HtmlNode node, TextWriter outText)
{
    string html;
    switch (node.NodeType)
    {
        case HtmlAgilityPack.HtmlNodeType.Comment:
            // don't output comments
            break;

        case HtmlAgilityPack.HtmlNodeType.Document:
            foreach (HtmlNode subnode in node.ChildNodes)
            {
              ConvertTo(subnode, outText);
            }
            break;

        case HtmlAgilityPack.HtmlNodeType.Text:
            // script and style must not be output
            string parentName = node.ParentNode.Name;
            if ((parentName == "script") || (parentName == "style"))
                break;

            // get text
            html = ((HtmlTextNode)node).Text;

            // is it in fact a special closing node output as text?
            if (HtmlNode.IsOverlappedClosingElement(html))
                break;

            // check the text is meaningful and not a bunch of whitespaces
            if (html.Trim().Length > 0)
            {
                outText.Write(HtmlEntity.DeEntitize(html) + " ");
            }
            break;

        case HtmlAgilityPack.HtmlNodeType.Element:
            switch (node.Name)
            {
                case "p":
                    // treat paragraphs as crlf
                    outText.Write("\r\n");
                    break;
            }

            if (node.HasChildNodes)
            {
            foreach (HtmlNode subnode in node.ChildNodes)
             {
              ConvertTo(subnode, outText);
             }
            }
            break;
    }
}

Ahora, en algunos casos, cuando las páginas html tienen un formato incorrecto (por ejemplo, la siguiente página - http://rareseeds.com/cart/products/Purple_of_Romagna_Artichoke-646-72.html tiene una etiqueta meta mal formada como <meta content="text/html; charset=uft-8" http-equiv="Content-Type"> ) [Nota" uft "en lugar de utf] mi código está empezando a fallar cuando intento cargar el documento html.

¿Puede alguien sugerirme cómo puedo superar estas páginas html con formato incorrecto y aún así extraer el texto relevante de un documento html?

Gracias, Kapil

Respuesta aceptada

Como se dice en la página del proyecto HtmlAgilityPack "El analizador es muy tolerante con el HTML malformado del" mundo real ". Pero el tipo de error que describe es demasiado serio tal vez para ser corregido. Puede establecer la codificación predeterminada con:

 HtmlDocument doc = new HtmlDocument();
 doc.OptionDefaultStreamEncoding = Encoding.UTF8;


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow