다른 숨겨진 범위를 포함하는 범위에서 내부 텍스트를 가져 오는 방법?

c# html html-agility-pack

문제

나는 몇몇 시험 HTML 페이지가있다.

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Page for test</title>
</head>
<body>
    <div class="r_tr">
        <span class="r_rs">Inner text<span class="otherSpan" style="display: none">text</span></span>
    </div>
</body>
</html>

나는 "내부 텍스트"를 원합니다. HtmlAgilityPack을 사용하고 있습니다. 나는이 방법을 쓴다.

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Page for test</title>
</head>
<body>
    <div class="r_tr">
        <span class="r_rs">Inner text<span class="otherSpan" style="display: none">text</span></span>
    </div>
</body>
</html>

이 메서드는 "내부 텍스트 텍스트"를 반환합니다. 내 문제를 설명하기 위해 몇 가지 단위 테스트를 작성합니다.

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Page for test</title>
</head>
<body>
    <div class="r_tr">
        <span class="r_rs">Inner text<span class="otherSpan" style="display: none">text</span></span>
    </div>
</body>
</html>

결과

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Page for test</title>
</head>
<body>
    <div class="r_tr">
        <span class="r_rs">Inner text<span class="otherSpan" style="display: none">text</span></span>
    </div>
</body>
</html>

수락 된 답변

XPath는 모르지만 LINQ를 사용하는 솔루션은 다음과 같습니다.

String inner = (from x in doc.DocumentNode.Descendants()
                where x.Name == "span"
                && x.Attributes["class"].Value == "r_rs"
                select 
                      (from y in x.ChildNodes
                       where y.Name == "#text"
                       select y.InnerText).FirstOrDefault()
                ).FirstOrDefault();

인기 답변

첫째, spanXPath 가 잘못되었습니다. // 는 시작에서 "루트에서 시작"을 의미하므로 row.SelectSingleNode(spanXPath) 는 행에없는 문서에서 r_rs 클래스의 첫 번째 요소를 항상 제공합니다. // 이것을 버리면 해결됩니다.

그런 다음 text() 는 텍스트 노드의 XPath입니다. 당신이 사용할 수있는

var span = row.SelectSingleNode(spanXPath);
var textNode = span.SelectSingleNode("text()");
text = textNode.InnerText;
Console.WriteLine("textL {0}", text);

foreach 루프에서 선택한 범위의 첫 번째 텍스트 노드를 가져옵니다.




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