6

スクリプト ノードと「relativeNav」というクラスを持つ ul 以外のノードを選択しようとしています。誰かが私を正しい道に導くことができますか? 私はこれを1週間探していましたが、どこにも見つかりません。現在、私はこれを持っていますが、明らかに //ul[@class='relativeNav'] も選択しています。SelectNode がそれを無視するように、それの NOT 式を置く方法はありますか?

        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//body//*[not(self::script)]/text()"))
        {
            Console.WriteLine("Node: " + node);
            singleString += node.InnerText.Trim() + "\n";
        }
4

2 に答える 2

4

次のような構造の Html ドキュメントがあるとします。

<html>
<head><title>HtmlDocument</title>
</head>
<body>
<div>
<span>Hello Span World</span>
<script>
Script Text
</script>
</div>
<ul class='relativeNav'>
<li>Hello </li>
<li>Li</li>
<li>World</li>
</ul>
</body>
</html>

次の XPath 式は、スクリプト要素ではないすべてのノードを選択し、クラス「relativeNav」を持つ UL 要素のすべての子を除外します。

var nodes = htmlDoc.DocumentNode.SelectNodes("//body//*[not(parent::ul[@class='relativeNav']) and not(self::script)]/text()");

更新:深さに関係なく ul[class='relativeNav'] の子を除外する必要がある場合は、次を使用する必要があることを忘れていました。

"//body//*[not(ancestor::ul[@class='relativeNav']) and not(self::script)]/text()"

ul 要素も除外したい場合 (要素にはテキストが含まれていないため、上記の例ではあまり関係ありません)、次のように指定する必要があります。

"//body//*[not(ancestor-or-self::ul[@class='relativeNav']) and not(self::script)]"
于 2012-11-05T07:59:09.867 に答える
2

これがあなたが必要とするものであることを願っています:

HtmlDocument doc = new HtmlDocument();
var nodesToExclude1 = doc.DocumentNode.SelectNodes("//ul[@class='relativeNav']");
var nodesToExclude2 = doc.DocumentNode.SelectNodes("//body//script");
var requiredNodes = doc.DocumentNode.SelectNodes("//")
                       .Where(node => !nodesToExclude1.Contains(node) &&
                                      !nodesToExclude2.Contains(node));

foreach (HtmlNode node in requiredNodes)
{
    Console.WriteLine("Node: " + node);
    singleString += node.InnerText.Trim() + "\n";
}
于 2012-11-05T03:30:23.277 に答える