1

HTML Agility Packを使用して、同じページで2つの異なることを実行しています。
最初の要素では、スクリプトやスタイルなどの要素を削除する必要があります。ただし、2番目の要素では、すべての要素を保持する必要があります。

最初の部分の前に2番目の部分を実行できないため、最初にオブジェクトを複製する方法を探しています。これにより、2番目の部分のすべての要素を保存できます。それは私が試したコードですが、いくつかの理由で、その中にノードがありません。

        HtmlDocument HTMLdoc = new HtmlDocument();
        HTMLdoc.LoadHtml(sFetch);

        //duplicate document node
        var webPage = HtmlNode.CreateNode("<html></html>");
        webPage.CopyFrom(HTMLdoc.DocumentNode,true);

私が考えたもう1つの方法は、削除するすべての要素を選択するxpathを反転することです。したがって、オブジェクトから要素を実際に削除しなくても、それらだけを選択できるようになります。しかし、XPathの「not()」関数を使用してクエリを反転する方法がわかりません。これが私のXPathクエリです。

"//script | //style | //iframe | //select | //textarea | //comment() | //a[@href]"

あなたの時間と助けてくれてありがとう:)

4

2 に答える 2

0

私は似たようなことをしています。この情報を取得してから XML に変換する必要がありました。必要なものは次のとおりです。

        HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
        htmlDoc.LoadHtml(sfetch);

        HtmlNodeCollection page = htmlDoc.DocumentNode.SelectNodes("//table");//whatever tags your are looking for in your doc

        foreach (HtmlNode value in page)
        {
            richTxtboxFilteredHTML.Text += value.InnerText;
        }

これをさらに処理する場合は、各 HtmlNode を参照し続ける必要があります。

于 2013-09-18T16:37:33.453 に答える
0

以下は、XPath 式の逆バージョンです。

var nodes = doc.DocumentNode
    .SelectNodes("//node()[not(self::script or self::style or self::iframe or self::select or self::textarea or self::comment() or self::a[@href])]")
    .ToList();

これにより、スクリプト、スタイルなどを除くノードが選択されます。

于 2012-08-23T15:05:10.933 に答える