하위 노드에서 HtmlAgilityPack 데이터 선택

c# html html-agility-pack linq parsing

문제

구문 분석하고 싶습니다 다음 HTML 코드가 있습니다.

<h3 class='bar'>
  <a href='http://anysite.com/index.php?showuser=7195' title='Profile view'>THIS_IS_USERNAME</a>
  &nbsp;
  <a href='http://anysite.com/index.php?showuser=7195&amp;f=' class='__user __id7195' title='Profile view'>
      <img src='http://anysite.com/public/style_images/car/user_popup.png' alt='' />
   </a>
</h3>

내가 필요한 것은 사용자 이름 ( "THIS_IS_USERNAME")과 프로필 ( " http://anysite.com/index.php?showuser=7195 ")에 대한 링크를 선택하는 것입니다.

다음 코드를 사용하여 상위 h3 노드를 선택할 수 있습니다.

<h3 class='bar'>
  <a href='http://anysite.com/index.php?showuser=7195' title='Profile view'>THIS_IS_USERNAME</a>
  &nbsp;
  <a href='http://anysite.com/index.php?showuser=7195&amp;f=' class='__user __id7195' title='Profile view'>
      <img src='http://anysite.com/public/style_images/car/user_popup.png' alt='' />
   </a>
</h3>

하지만 "h3"노드 자체를 어떻게 가져올 수 있습니까? "h3"내부에는 "h3"이라는 속성 링크가 있는데 여기에는 사용자 이름과 필요한 프로필 링크가 들어 있습니다.

수락 된 답변

링크 노드를 직접 질의 할 수 있습니다. 링크 노드의 Title 속성과 매우 흡사합니다.

이 경우 XPath를 사용하면 모든 중간 null 검사를 처리하는 것처럼 더 간단 할 것이며 Linq 쿼리에 많은 상수 문자열이 있기 때문에 형식 안전성과 같습니다.

var node = HTMLPage.DocumentNode.SelectSingleNode("//hr[@class='Bar']/a[@title='Profile View' and @href");
if (node != null)
{
    string link = node.Attributes["href"].Value;
    string username = node.InnerText;
}

Linq 구문을 사용하여 유사한 코드를 작성할 수 있습니다. 먼저 링크 태그를 검색 한 다음 역 추적하여 해당 태그에 대한 h3 상위를 찾습니다. 그렇게하면 중간 널을 검사 할 필요가 없습니다;) :

var node = HTMLPage.DocumentNode.SelectSingleNode("//hr[@class='Bar']/a[@title='Profile View' and @href");
if (node != null)
{
    string link = node.Attributes["href"].Value;
    string username = node.InnerText;
}

또는 "bar"의 첫 번째 <a> 자식 인 위치를 사용할 수 있습니다.

var node = HTMLPage.DocumentNode.SelectSingleNode("//hr[@class='Bar']/a[@title='Profile View' and @href");
if (node != null)
{
    string link = node.Attributes["href"].Value;
    string username = node.InnerText;
}



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