c# - parser - htmlagilitypack nuget
Agarra todo el texto de html con Html Agility Pack (5)
Entrada
<html><body><p>foo <a href=''http://www.example.com''>bar</a> baz</p></body></html>
Salida
foo
bar
baz
Sé de htmldoc.DocumentNode.InnerText
, pero le dará foobarbaz
: quiero obtener cada texto, no todos a la vez.
Necesitaba una solución que extraiga todo el texto, pero descarta el contenido de las etiquetas de estilo y script. No pude encontrarlo en ninguna parte, pero se me ocurrió lo siguiente que se adapta a mis propias necesidades:
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);
XPATH es tu amigo :)
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);
}
public string html2text(string html) {
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(@"<html><body>" + html + "</body></html>");
return doc.DocumentNode.SelectSingleNode("//body").InnerText;
}
Esta solución está basada en Html Agility Pack . También puede instalarlo a través de NuGet (nombre del paquete: HtmlAgilityPack
).
var pageContent = "{html content goes here}";
var pageDoc = new HtmlDocument();
pageDoc.LoadHtml(pageContent);
var pageText = pageDoc.DocumentNode.InnerText;
El ejemplo especificado para el contenido html:
<html><body><p>foo <a href=''http://www.example.com''>bar</a> baz</p></body></html>
producirá la siguiente salida:
foo bar baz
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());
}
}
Esto hace lo que necesita, pero no estoy seguro de si esta es la mejor manera. Tal vez debería iterar a través de algo que no sea DescendantNodesAndSelf para obtener un rendimiento óptimo.