C#: 使用HtmlAgilityPack提取内部文本

7
我正在使用HtmlAgilityPack。是否有一行代码可以获取html的所有内部文本,例如删除所有html标签和脚本?
2个回答

18

像这样:

document.DocumentNode.InnerText

请注意,这将返回 <script> 标签的文本内容。

为了解决这个问题,你可以像这样删除所有的 <script> 标签:

foreach(var script in doc.DocumentNode.Descendants("script").ToArray())
    script.Remove();
foreach(var style in doc.DocumentNode.Descendants("style").ToArray())
    style.Remove();

我使用了这段代码来解决我的一个问题。不过我有一个问题,如何在 foreach 循环中执行移除操作? - Win Coder
@WinCoder:你是什么意思? - SLaks
我的意思是,使用foreach循环的集合不能被修改。 - Win Coder
@WinCoder:这就是为什么我调用 ToArray() 来在单独的副本上进行迭代的原因。 - SLaks
如果您正在迭代一个单独的副本,那么为什么原始副本会被修改呢? - Win Coder
显示剩余2条评论

1
我写了一个简单的方法,可能会对你有所帮助。这个方法可以提取所有特定标签的节点。然后你可以使用 HtmlNodeCollection[i].InnerText 来获取它的文本。
    HtmlDocument hDoc;
    HtmlNodeCollection nodeCollection;

    public void InitInstance(string htmlCode) {
        hDoc.LoadHtml(htmlCode);
        nodeCollection = new HtmlNodeCollection();
    }
    private void GetAllNodesInnerTextByTagName(HtmlNode node, string tagName) {
        if (null == node.ChildNodes) {
            return ;
        } else {
            HtmlNodeCollection nCollection = node.SelectNodes( tagName );
            if( null != nCollection ) {
                for( int i=0; i<nCollection.Count; i++) {
                    nodeCollection.Add( nCollection[i]);
                    nCollection[i].Remove();
                }
            }
            nCollection=node.ChildNodes;
            if(null != nCollection) {
                for(int i=0;i<nCollection.Count; i++) {
                    GetAllNodesInnerTextByTagName( nCollection[i] , tagName );
                }
            }
        }

通常,文章的内容总是在<p>标签中。 - tsingroo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接