【问题标题】:Why is my HTML document being scrambled when using FSharp.Data HTML parser?为什么我的 HTML 文档在使用 FSharp.Data HTML 解析器时会被打乱?
【发布时间】:2020-11-05 22:58:21
【问题描述】:

当尝试使用 FSharp.Data 库处理一些 HTML 时,我得到了令人困惑的结果。

代码如下:

let manipulateHtml (htmlDoc:HtmlDocument) =
    htmlDoc.Html().Descendants()
    |> filterFromHtml stuffToRemove 
    |> HtmlDocument.New

当我打印生成的 Html 文档时,它的顺序不正确 - 它似乎从随机节点开始重建文档。 HtmlDocument.New(seq) 如何重建 html 文档,有没有办法以正确的格式重建文档 - 例如原来的顺序?

【问题讨论】:

  • 有趣 - 好吧,Descendants() 在技术上是一个 seq,它类似于 IEnumerable,并且不保证遵循顺序。您是否尝试过在过滤前插入|> Seq.toList
  • 即使我转换为列表问题仍然存在

标签: html parsing f# f#-data


【解决方案1】:

那是因为Descendants() 方法以递归方式返回所有的孩子。这意味着返回的序列将包含所有的祖父母、父母、孩子……节点。

例如,当文档是:

<html>
    <tag1>
        <tag2>
            this is the text
        </tag2>
    </tag1>
</html>

然后Descendants() 将返回一个这样的节点序列:

<tag1>
    <tag2>
        this is the text
    </tag2>
</tag1>

<tag2>
    this is the text
</tag2>

this is the text

但是HtmlDocument.New 方法以扁平方式构造文档,因此您将得到一个类似于上面的文档,其中tag2 重复了两次,this is the text 重复了 3 次。

所以为了解决你的问题,你需要遍历htmlDoc.Html()的树,确定保留哪个节点,同时使用HtmlNode.New***()HtmlDocument.New***()方法构造一棵新树。

【讨论】:

  • 你知道库是否提供了一种以非递归或平面方式遍历dom的方法吗?
  • elements 将为您提供以下节点。或者你可以使用HtmlAgilityPack,它支持XPath等。
  • 我认为问题实际上是Visual Studio提供的控制台只能显示一定数量的行。这在我调试时切断了结果,使其看起来好像节点是从随机位置开始的。后代工作正常。
猜你喜欢
  • 2019-10-28
  • 2016-11-10
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多