0

我在使用正则表达式准备字符串时遇到问题。我写了这个函数:

    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 -> HTMLAgilityPack 有任何转换功能吗?其次,通常我想将 InnerText 的结果放入 Json 并将其发送到 Javascript。如何删除 Javascript 中禁止的字符?

4

1 回答 1

6

Regex往往是解析 HTML 的糟糕选择,尤其是来自不同来源的解析。

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

什么是 Html Agility Pack (HAP)?

这是一个敏捷的 HTML 解析器,它构建一个读/写 DOM 并支持普通的 XPATH 或 XSLT(实际上你不必了解 XPATH 或 XSLT 就可以使用它,不用担心......)。它是一个 .NET 代码库,允许您解析“网络之外”的 HTML 文件。解析器对“真实世界”格式错误的 HTML 非常宽容。对象模型与 System.Xml 的提议非常相似,但用于 HTML 文档(或流)。

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

于 2012-08-29T10:09:10.057 回答