HtmlAgilityPack은 코드에 지정된 div 하나뿐만 아니라 페이지의 모든 div에서 텍스트를 추출합니다.

c# html-agility-pack

문제

HtmlAgilityPack을 사용하는 xpath 표현식에서 이상한 동작이 발생했습니다. HtmlAgilityPack을 사용하여 <div class='cont'> 로 선언 된 div 내의 모든 값을 추출하려고합니다. 그러나 아래 코드를 사용하면 <div class='cont'><div class='button'> . 왜 이런 일이 일어나는 지 아는 사람이 있습니까? 그것을 재현하는 전체 코드는 다음과 같습니다.

using System;
using System.Xml.XPath;
using HtmlAgilityPack;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            const string text1 = @"<div class=""cont"">
<h3>content</h3> 
<div style=""margin: 0cm 0cm 0pt"" class=""Normal"">content1</div><div style=""margin: 0cm 0cm 0pt"" class=""Normal""> content2</div>
<div style=""margin: 0cm 0cm 0pt"" class=""Normal"">content3 </div>
<div>content4 </div><strong>content5
<div>content6 </div><ul type=""disc"">    
<div>content7 </div>        
<div>content8 </div>    </ul>
<p class='margin10'><font size=""2"">
<div>
<p><span style=""font-family: Arial"">content9</span></p>
</div>
<div>content10</font><a href=""mailto:james@polis.com""><u><font color=""#0000ff"" size=""2""><font color=""#0000ff"" size=""2""> content11 </u></font></font></a><font size=""2""> content12
<div>content13</div>
</div>
</font>
</p>
</div>
<div class=""button"">
<span class=""applybtn""><a class=""buttonGlobal buttonAlpha"" href=""/uk/job/apply/(id)/608735"">content14</a></span>
</div>";
            foreach (XPathNavigator node in SearchInPage(text1, "//div[@class='cont']"))
            {
                Console.WriteLine("option " + node.Value);
            }

        }

        private static XPathNodeIterator SearchInPage(string text, string xpath)
        {
            HtmlDocument htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(text);
            XPathNavigator xpathNavigator = htmlDocument.CreateNavigator();
            XPathNodeIterator nodes = xpathNavigator.Select(xpath);
            return nodes;
        }
    }
}

코드는 다음을 반환합니다 : 'content', 'content1-13' <div class='button'> 내에있는 'content14'

인기 답변

그래서 올바르게 이해했다면 노드 <div class="cont"> 의 자식 노드에 대해서만 값을 찾고 싶습니까?

이 시도:

HtmlDocument doc = new HtmlDocument;
doc.Load(Html);
HtmlNode node = doc.DocumentNode.SelectSingleNode(".//div[@class='cont']");

foreach(HtmlNode childNode in node)
{
    Console.WriteLine(childNode.Value);
}

나 앞에서 이걸 디버깅 할 방법이 없지만이 방법이 효과적이다. (".//div[@class='cont']") 는 지정된 노드와 그 자식 노드 만 선택하고 지정된 노드 외부에있는 모든 것은 무시해야합니다. 나머지는 Linq 및 HtmlAgilityPack입니다. HtmlAgilityPack은 XPath를 구현하므로 XPath를 사용하기 전에 AgilityPacks의 사용 가능한 메소드를 살펴보아야합니다. xml 및 html은 다른 언어이므로 하나의 언어로만 작동한다는 점을 기억하십시오. 다른.




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