HtmlAgility - 从HTML中提取和替换纯文本部分(在任何标记之外)

时间:2015-04-05 22:30:10

标签: c# html-agility-pack httphandler

我使用HtmlAgility包,我想从HTML中提取和替换每个纯文本部分(不在标签内)。

<html><body>bla bla 1<br />bla bla 2<br />bla bla 3<img src="img.jpg" /></body></html>

输出应该是包含bla bla 1的列表; bla bla 2; bla bla 3;

node.InnerText不适用于此。

2 个答案:

答案 0 :(得分:0)

我用过:

// loop over innerhtml and process
var thenode = document.DocumentNode.Descendants().Where(n => n.Name == "body").FirstOrDefault();
if (thenode != null)
{
    // InnerHtml replaces <br /> with <br>
    String[] strings = thenode.InnerHtml.Split(new string[] { "<br>" }, StringSplitOptions.RemoveEmptyEntries);
    foreach (String str in strings)
    {
        String lstr = str.Trim();
        if (lstr != String.Empty && !lstr.StartsWith("<"))
        {
            // do processing
            String loutput = Processing(lstr);
            thenode.InnerHtml = thenode.InnerHtml.Replace(lstr, loutput);
        }
    }
}

答案 1 :(得分:0)

使用一些新文本替换 <body>标记内的所有文本节点的一种可能方法:

//select all text nodes that is "direct child of <body>" and "not empty"
var textNodes = doc.DocumentNode.SelectNodes("//body/text()[normalize-space()]");
foreach (HtmlNode textNode in textNodes)
{
    textNode.ParentNode
            //replace each text node with "new text" for the sake of demo
            .ReplaceChild(HtmlNode.CreateNode("new text")
                          , textNode
            );
}

旁注:我没有在任何标记之外看到文本节点为,因为它们是里面的<{em} <body>标记。我将它们视为<body>标记的直接子