【问题标题】:How to traverse an FSharp.Data HtmlDocument to extract content as a string?如何遍历 FSharp.Data HtmlDocument 以将内容提取为字符串?
【发布时间】:2020-03-20 16:28:15
【问题描述】:

我想写一个函数让我从这个 html 中获取信息:

<div>
  <h1>Some header.</h1>
  <ul>
    <li>
      <p>Hello world!</p>
    </li>
    <li>
      <p>What is going on? <a href="http://example.com">This is a link</a>.</p>
    </li>
  </ul>
</div>

到这个字符串:

一些标题。你好世界!到底是怎么回事?这是一个链接。

换句话说:我想让这个测试通过:

let testInput: string = """
<div>
  <h1>Some header.</h1>
  <ul>
    <li>
      <p>Hello world!</p>
    </li>
    <li>
      <p>What is going on? <a href="http://example.com">This is a link</a>.</p>
    </li>
  </ul>
</div>
"""

let getContentsFromHtmlDocument (doc: HtmlDocument) =
  let getInner (node: HtmlNode): string =
    // How can I traverse this tree?
    ""
  let result =
    doc.Descendants ["h1"; "p"; "a"]
    |> Seq.map getInner
    |> List.ofSeq
    |> List.fold (+) ""
  result

[<Test>]
let Test1 () =
    let htmlDoc: HtmlDocument = HtmlDocument.Parse(testInput)
    let res = getContentsFromHtmlDocument htmlDoc
    Assert.AreEqual("Some header. Hello world! What is going on? This is a link.", res)

但我无法确定如何遍历树。任何帮助,将不胜感激!谢谢。

【问题讨论】:

    标签: f# f#-data


    【解决方案1】:

    HtmlNodeExtensions 中有一个扩展方法,它提供了您通常用来遍历树的方法。对于您的特定用例,有HtmlNodeExtensions.DirectInnerText(n)

    不过,要通过测试,您需要使用空格分隔的内部文本,String.Join 这样做效率更高。

    let getContentsFromHtmlDocument (doc: HtmlDocument) =
        let getInner (node: HtmlNode): string =
            node.DirectInnerText()
    
        let result =
            doc.Descendants ["h1"; "p"; "a"]
            |> Seq.map getInner
            |> fun all -> String.Join(" ", all)
    
        result
    

    还有一个问题:

    <p>What is going on? <a href="http://example.com">This is a link</a>.</p>
    

    这将加入:

    What is going on? . This is a link 而不是What is going on? This is a link.,您当前的结构无法处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 2012-12-06
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      相关资源
      最近更新 更多