HtmlAgilityPack 구문 분석 특성

c# html-agility-pack

문제

HTML을 파싱하려고하는데 조건 (예 : 클래스 이름이 X 여야 함)을 사용하는 방법을 모르겠습니다. 민첩성 팩에 대한 많은 주제가 있지만 도움이되는 것은 없습니다.

<div class="main-class">
<a href="LINK">
<img src="IMAGELINK" alt="SOMETEXT" class="image-class">
</a>
</div>

<p> bla bla </p>

<div class="main-class">
<a href="LINK">
<img src="IMAGELINK" alt="SOMETEXT" class="image-class">
</a>
</div>

<div class="main-class">
<a href="LINK">
<img src="IMAGELINK" alt="SOMETEXT" class="image-class">
</a>
<p> asd sadh awww </p>
</div>

클래스 이름 "main-class"로 각 div에 대해 href, src 및 alt를 얻고 싶습니다.이 코드는 제 코드이지만 "p"만 인쇄합니다. 그 방법은 내가 아는 것입니다.

      HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(dataString);
         foreach (HtmlNode nodeItem in doc.DocumentNode.Descendants("p").ToArray())
          {
              Debug.WriteLine(nodeItem.InnerText);
          }

"SelectNodes"가 지원되지 않는 WP 앱에서 작업하고 있습니다.

수락 된 답변

전통적인 비 XPath 방식을 사용합니다.

참고 : null 가능 값 확인이 생략되었습니다.

string dataString = "<div class=\"main-class\"><a href=\"LINK\"><img src=\"IMAGELINK\" alt=\"SOMETEXT\" class=\"image-class\"></a></div><p> bla bla </p><div class=\"main-class\"><a href=\"LINK\"><img src=\"IMAGELINK\" alt=\"SOMETEXT\" class=\"image-class\"></a></div><div class=\"main-class\"><a href=\"LINK\"><img src=\"IMAGELINK\" alt=\"SOMETEXT\" class=\"image-class\"></a><p> asd sadh awww </p></div>";

var doc = new HtmlDocument();
doc.LoadHtml(dataString);

var elements = doc.DocumentNode.Descendants("div").Where(o => o.GetAttributeValue("class", "") == "main-class");
foreach (var nodeItem in elements)
{
    var aTag = nodeItem.Descendants("a").First();
    var aTagHrefValue = aTag.Attributes["href"];

    var imgTag = nodeItem.Descendants("img").First();
    var imgTagSrcValue = imgTag.Attributes["src"];
    var imgTagAltValue = imgTag.Attributes["alt"];

    Console.WriteLine("a href value: {0}", aTagHrefValue.Value);
    Console.WriteLine("img src value: {0}", imgTagSrcValue.Value);
    Console.WriteLine("img alt value: {0}", imgTagAltValue.Value);
    Console.WriteLine();
}

인기 답변

LINQ를 사용할 수 있습니다.

var attrs = doc.DocumentNode
               .Descendants("div")
               .Where(d => d.Attributes != null &&
                           d.Attributes.Contains("class") &&
                           d.Attributes["class"].Value.Contains("main-class"))
               .Select(d => new
               {
                   anchor = d.SelectSingleNode("a"),
                   img = d.SelectSingleNode("a") != null 
                                                 ? d.SelectSingleNode("a").SelectSingleNode("img") 
                                                 : null 
               })
               .Select(d => new
               {
                   href = d.anchor != null 
                                   ? d.anchor.GetAttributeValue("href", string.Empty) 
                                   : string.Empty,
                   imgsrc = d.img != null 
                                  ? d.img.GetAttributeValue("src", string.Empty) 
                                  : string.Empty,
                   imgalt = d.img != null 
                                  ? d.img.GetAttributeValue("alt", string.Empty) 
                                  : string.Empty
               })
               .ToList();


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