首页 > 解决方案 > 为什么我的 HTML 文档在使用 FSharp.Data HTML 解析器时会被打乱?

问题描述

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

这是代码:

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

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

标签: htmlparsingf#f#-data

解决方案


那是因为该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***()andHtmlDocument.New***()方法构造一棵新树。


推荐阅读