f#按标签分割html

时间:2013-02-24 12:44:14

标签: html string parsing f# split

我想解析一个HTML文档,并将每个段落作为单独的条目打印到日志文件中。到目前为止,我有:

let parseTextFile (path) =
        let fileText = File.ReadAllText(path)
        fileText.Split('<p>') |> Seq.iter (fun m -> logEmail(m))

但不幸的是对我来说string.Split没有做我想要的事情,似乎存在用单个字符分隔符分割字符串。如何使用多个单个字符分割文件,拥有更多内容而不仅仅是&lt; p&gt;因为我只有一个&lt; / p&gt;在该段末尾。使用正则表达式或某种复杂的匹配器,我可以更具体地选择&lt; p&gt;之间的所有内容。标签

2 个答案:

答案 0 :(得分:5)

尝试使用特定的库来解析html,例如HtmlAgilityPack

答案 1 :(得分:1)

正如wmeyer所说,你需要在字符串上使用.Split()方法的不同重载。实际上,您发布的代码甚至不会编译,因为'<p>'不是字符串文字 - 您需要使用"<p>"代替(单引号用于字符文字)。

以下是如何使用.Split()的正确重载:

open System.IO

let parseTextFile path =
    let fileText = File.ReadAllText path
    fileText.Split ([| "<p>"; |], System.StringSplitOptions.RemoveEmptyEntries)
    |> Seq.iter logEmail

在F#Interactive中进行快速测试:

> "First paragraph<p>Second paragraph.<p><p>Third paragraph.<p>"
   .Split ([| "<p>"; |], System.StringSplitOptions.RemoveEmptyEntries);;
val it : string [] =
  [|"First paragraph"; "Second paragraph."; "Third paragraph."|]

最后,正如@ntr所说 - 使用像HTML Agility Pack这样的库来解析HTML,你会更好,更多更好。他们的解析器非常强大,可以为您节省很多麻烦。