0

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

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

但对我来说不幸的是 string.Split 在这里没有做我想要的,似乎存在用单个字符分隔符分割字符串。我如何使用不只是一个字符的东西来分割文件,除了 <p> 之外还有其他东西可能会很好,因为我将在段落末尾有一个 </p> 。使用正则表达式或某种复杂的匹配器,我可以更具体地挑选出 <p> 标记之间的所有内容。

4

2 回答 2

4

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

于 2013-02-24T13:27:12.053 回答
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 会好得多他们的解析器非常健壮,可以为您省去很多麻烦。

于 2013-02-24T15:25:38.303 回答