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