使用C#删除HTML标记

时间:2012-08-29 10:06:13

标签: c# html regex

我在使用Regex准备String时遇到问题。 我写了这个函数:

    private String parseAnswer(String res)
    {
        String[] pattern = new String[16] { "<head[^>]*?>.*?</head>", "<style[^>]*?>.*?</style>", "<script[^>]*?.*?</script>", "<object[^>]*?.*?</object>", "<embed[^>]*?.*?</embed>", "<applet[^>]*?.*?</applet>", "<noframes[^>]*?.*?</noframes>", "<noscript[^>]*?.*?</noscript>", "<noembed[^>]*?.*?</noembed>", "</?((address)|(blockquote)|(center)|(del))", "</?((div)|(h[1-9])|(ins)|(isindex)|(p)|(pre))", "</?((dir)|(dl)|(dt)|(dd)|(li)|(menu)|(ol)|(ul))", "</?((table)|(th)|(td)|(caption))", "</?((form)|(button)|(fieldset)|(legend)|(input))", "</?((label)|(select)|(optgroup)|(option)|(textarea))", "</?((frameset)|(frame)|(iframe))" };
        String[] replacement = new String[16] { " ", " ", " ", " ", " ", " ", " ", " ", " ", "\n$0", "\n$0", "\n$0", "\n$0", "\n$0", "\n$0", "\n$0" };

        for (int i = 0; i < pattern.Length; i++)
        {
            res = Regex.Replace(res, pattern[i], replacement[i]);
        }

        return res;
    }

此函数获取HTML代码作为输入。我想清除一些HTML标签。要做到这一点,我准备模式阵列。但似乎我的功能不清除HTML代码。 我的模式是我要删除的HTML标记列表。有些标签我不会删除但只添加\ n。

你能帮我解决这个正则表达式吗?或者给我任何图书馆来做任务?我的目标是删除HTML标记,只接收要解析的网站文本。

编辑: 好的,我可以使用HTMLAgilityPack,但我有几个问题: htmlDoc.LoadHtml(URL); - 我需要将结果翻译成UTF8 - &gt; HTMLAgilityPack有任何转换功能吗? 其次,我希望将InnerText的结果放到Json并将其发送到Javascript。 如何在Javascript中禁止删除char?

1 个答案:

答案 0 :(得分:6)

Regex往往是poor choice for parsing HTML,特别是来自不同来源。

我建议使用专用的解析器,例如HTML Agility Pack

  

什么是Html Agility Pack(HAP)?

     

这是一个敏捷的HTML解析器,它构建一个读/写DOM并支持普通的XPATH或XSLT(你实际上不需要理解XPATH或XSLT来使用它,不用担心......)。它是一个.NET代码库,允许您解析“out of the web”HTML文件。解析器非常容忍“真实世界”格式错误的HTML。对象模型与提出System.Xml非常相似,但对于HTML文档(或流)。

源代码下载附带了许多示例项目,这些项目记录了如何将库用于不同的任务。