HtmlAgilityPack gibt Probleme mit falsch formatiertem HTML

c# html-agility-pack

Frage

Ich möchte aussagekräftigen Text aus einem HTML-Dokument extrahieren und ich habe html-agility-pack für dasselbe verwendet. Hier ist mein Code:

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

KonvertierenHtml:

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

Konvertieren zu:

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

Jetzt in einigen Fällen, wenn die HTML-Seiten fehlerhaft sind (zum Beispiel die folgende Seite - http://rareseeds.com/cart/products/Purple_of_Romagna_Artichoke-646-72.html hat ein falsch formatiertes Meta-Tag wie <meta content="text/html; charset=uft-8" http-equiv="Content-Type"> ) [Hinweis" uft "statt utf] mein Code kotzt zu dem Zeitpunkt, zu dem ich versuche, das HTML-Dokument zu laden.

Kann mir jemand vorschlagen, wie ich diese misslungenen HTML-Seiten überwinden und trotzdem relevanten Text aus einem HTML-Dokument extrahieren kann?

Danke, Kapil

Akzeptierte Antwort

Wie es in der HtmlAgilityPack-Projektseite heißt "Der Parser ist sehr tolerant gegenüber" realem "fehlerhaften HTML". Aber die Art von Fehler, die Sie beschreiben, ist zu gravierend, um vielleicht korrigiert zu werden. Sie können die Standardcodierung festlegen mit:

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


Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum