HtmlAgilityPack SelectNodes 표현식을 사용하여 특정 속성이있는 요소를 무시합니다.

c# html-agility-pack selectnodes xpath

문제

스크립트 노드와 'relativeNav'라는 클래스가있는 ul을 제외하고 노드를 선택하려고합니다. 누군가 나를 올바른 길로 인도 할 수 있습니까? 나는 이것을 일주일 동안 찾고 있었고 어디서나 그것을 찾을 수 없었다. 현재 이걸 가지고 있지만 분명히 // 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";
        }

수락 된 답변

다음과 비슷한 구조의 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 요소의 모든 자식을 제외하고 스크립트 요소가 아닌 모든 노드를 선택합니다.

<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>

업데이트 : 깊이에 관계없이 ul [class = 'relativeNav']의 자녀를 제외해야하는 경우 다음을 사용해야 함을 잊어 버렸습니다.

<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>

ul 요소를 제외시키려는 경우 (요소에 텍스트가 포함되어 있지 않으므로 위 예제에서는 다소 중요 함) 다음을 지정해야합니다.

<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>

인기 답변

이것이 당신이 필요로하는 바입니다.

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";
}



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.