HtmlAgilityPack donnant des problèmes avec le HTML malformé

c# html-agility-pack

Question

Je veux extraire du texte significatif d'un document HTML et j'utilisais html-agility-pack pour la même chose. Voici mon code:

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 en:

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;
    }
}

Maintenant, dans certains cas, lorsque les pages HTML sont mal formées (par exemple, la page suivante - http://rareseeds.com/cart/products/Purple_of_Romagna_Artichoke-646-72.html comporte une méta-balise malformée telle que <meta content="text/html; charset=uft-8" http-equiv="Content-Type"> ) [Remarque" uft "au lieu de utf] mon code est en train de vomir au moment où j'essaie de charger le document html.

Quelqu'un peut-il me suggérer comment surmonter ces pages html malformées tout en continuant d’extraire du texte pertinent d’un document html?

Merci Kapil

Réponse acceptée

Comme il est dit dans la page du projet HtmlAgilityPack "L’analyseur est très tolérant avec le code HTML mal formé du" monde réel "". Mais le type d'erreur que vous décrivez est peut-être trop grave pour être corrigé. Vous pouvez définir le codage par défaut avec:

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi