HTMLAgilityPack节点名称过滤器不起作用

时间:2013-01-28 21:46:06

标签: c# linq c#-4.0 html-agility-pack

我想使用HTMLAgilityPack获取网页文字。我有一些代码:

HtmlAgilityPack.HtmlWeb TheWebLoader = new HtmlWeb();
HtmlAgilityPack.HtmlDocument TheDocument = TheWebLoader.Load(textBox1.Text);

List<string> TagsToRemove = new List<string>() { "script", "style", "link", "br", "hr" };

var Strings = (from n in TheDocument.DocumentNode.DescendantsAndSelf()
               where !TagsToRemove.Contains(n.Name.ToLower())
               select n.InnerText).ToList();

textBox2.Lines = Strings.ToArray();

问题是,它也会返回script标记的内容。我不知道为什么会这样。有人能帮助我吗?

1 个答案:

答案 0 :(得分:3)

你的问题来自于InnerText没有返回你期望的事实。

在:

<A>
    Text1
    <B>Text2</B>
</A>

它返回:

Text1
Text2

然后,例如,对于根节点,执行document.DocumentNode.InnerText将为您提供script等中的所有文本...

我建议你删除所有你不想要的标签:

foreach (HtmlNode nodeToRemove in (from descendant in TheDocument.DocumentNode.Descendants()
                                   where TagsToRemove.Contains(descendant.Name)
                                   select descendant).ToList())
    nodeToRemove.Remove();

然后获取文本元素列表:

List<string> Strings = (from descendant in TheDocument.DocumentNode.DescendantsAndSelf().OfType<HtmlTextNode>()
                        select descendant.InnerText).ToList();