web-dev-qa-db-fra.com

Récupérez tout le texte en html avec Html Agility Pack

Contribution

<html><body><p>foo <a href='http://www.example.com'>bar</a> baz</p></body></html>

Production

foo
bar
baz

Je connais htmldoc.DocumentNode.InnerText, mais cela donnera foobarbaz - Je veux obtenir chaque texte, pas tous à la fois.

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

Cela fait ce dont vous avez besoin, mais je ne sais pas si c'est la meilleure façon. Vous devriez peut-être parcourir autre chose que DescendantNodesAndSelf pour des performances optimales.

10
Dyppl

XPATH est votre ami :)

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(@"<html><body><p>foo <a href='http://www.example.com'>bar</a> baz</p></body></html>");

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

L'exemple spécifié pour le contenu html:

<html><body><p>foo <a href='http://www.example.com'>bar</a> baz</p></body></html>

produira la sortie suivante:

foo bar baz
10
Vadim Gremyachev

J'avais besoin d'une solution qui extrait tout le texte mais rejette le contenu des balises de script et de style. Je ne pouvais le trouver nulle part, mais j'ai trouvé ce qui suit qui convient à mes propres besoins:

StringBuilder sb = new StringBuilder();
IEnumerable<HtmlNode> 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);
9
public string html2text(string html) {
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(@"<html><body>" + html + "</body></html>");
    return doc.DocumentNode.SelectSingleNode("//body").InnerText;
}

Cette solution de contournement est basée sur Html ​​Agility Pack . Vous pouvez également l'installer via NuGet (nom du package: HtmlAgilityPack).

3
Vito Gentile