Greifen Sie den gesamten Text aus HTML mit Html Agility Pack

Eingang

foo bar baz

Ausgabe

 foo bar baz 

Ich weiß von htmldoc.DocumentNode.InnerText , aber es wird foobarbaz geben – ich möchte jeden Text, nicht alle gleichzeitig erhalten.

     var root = doc.DocumentNode; var sb = new StringBuilder(); foreach (var node in root.DescendantNodesAndSelf()) { if (!node.HasChildNodes) { string text = node.InnerText; if (!string.IsNullOrEmpty(text)) sb.AppendLine(text.Trim()); } } 

    Das tut, was Sie brauchen, aber ich bin mir nicht sicher, ob dies der beste Weg ist. Vielleicht sollten Sie etwas anderes als DescendantNodesAndSelf für eine optimale performance durchlaufen.

    XPATH ist dein Freund 🙂

     HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(@"

    foo bar baz

    "); foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//text()")) { Console.WriteLine("text=" + node.InnerText); }
     var pageContent = "{html content goes here}"; var pageDoc = new HtmlDocument(); pageDoc.LoadHtml(pageContent); var pageText = pageDoc.DocumentNode.InnerText; 

    Das angegebene Beispiel für den HTML-Inhalt:

     

    foo bar baz

    wird folgende Ausgabe erzeugen:

     foo bar baz 

    Ich brauchte eine Lösung, die den gesamten Text extrahiert, aber den Inhalt von Skript- und Style-Tags verwirft. Ich konnte es nirgends finden, aber ich habe das Folgende gefunden, was meinen eigenen Bedürfnissen entspricht:

     StringBuilder sb = new StringBuilder(); IEnumerable nodes = doc.DocumentNode.Descendants().Where( n => n.NodeType == HtmlNodeType.Text && n.ParentNode.Name != "script" && n.ParentNode.Name != "style"); foreach (HtmlNode node in nodes) { Console.WriteLine(node.InnerText); 
     public string html2text(string html) { HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(@"" + html + ""); return doc.DocumentNode.SelectSingleNode("//body").InnerText; } 

    Diese Problemumgehung basiert auf dem Html Agility Pack . Sie können es auch über NuGet installieren (Paketname: HtmlAgilityPack ).