我正在学习 F#,并且我已经开始使用序列和match
表达式。
我正在编写一个网络爬虫,它通过类似于以下内容的 HTML 进行查看,并<span>
在该类的父paging
级中获取最后一个 URL。
<html>
<body>
<span class="paging">
<a href="http://google.com">Link to Google</a>
<a href="http://TheLinkIWant.com">The Link I want</a>
</span>
</body>
</html>
我尝试获取最后一个 URL 如下:
type AnHtmlPage = FSharp.Data.HtmlProvider<"http://somesite.com">
let findMaxPageNumber (page:AnHtmlPage)=
page.Html.Descendants()
|> Seq.filter(fun n -> n.HasClass("paging"))
|> Seq.collect(fun n -> n.Descendants() |> Seq.filter(fun m -> m.HasName("a")))
|> Seq.last
|> fun n -> n.AttributeValue("href")
但是,当我正在搜索的课程不在页面上时,我遇到了问题。特别是我得到 ArgumentExceptions 的消息:Additional information: The input sequence was empty.
paging
我的第一个想法是构建另一个匹配空序列并在页面上找不到类时返回空字符串的函数。
let findUrlOrReturnEmptyString (span:seq<HtmlNode>) =
match span with
| Seq.empty -> String.Empty // <----- This is invalid
| span -> span
|> Seq.collect(fun (n:HtmlNode) -> n.Descendants() |> Seq.filter(fun m -> m.HasName("a")))
|> Seq.last
|> fun n -> n.AttributeValue("href")
let findMaxPageNumber (page:AnHtmlPage)=
page.Html.Descendants()
|> Seq.filter(fun n -> n.HasClass("paging"))
|> findUrlOrReturnEmptyStrin
我现在的问题是这Seq.Empty
不是文字,不能在模式中使用。大多数具有模式匹配的示例[]
在其模式中指定了空列表,所以我想知道:如何使用类似的方法来匹配空序列?