htmlagilitypack을 사용하여 2 개의 html 요소간에 html을 가져올 수 있습니까?

asp.net c# html-agility-pack

문제

나는 C #으로 htmlagilitypack을 사용하여 2 개의 다른 html 요소 내에 포함 된 html 요소를 검색 할 필요가있다.

예를 들어, 나는 다음과 같습니다 :

<div id="div1" style="style definition here">
  <strong>
    <font face="Verdana" size="2">Your search request retrieved 0 matches.</font>
  </strong>
  <font face="Verdana" size="2">Some more text here.</font>
  <br><br>
  <!--more html here-->
</div>

나는 모든 것을 돌려주고 싶다.

<div id="div1">

그리고 첫 번째

<br>

이러한 요소 중 하나를 반환하지 않고

이 구문에 대한 내 머리를 얻을 수 없기 때문에 누군가가 내게 2 개의 다른 알려진 시작 태그 사이에 존재하는 HTML을 얻는 가장 좋은 방법을 설명 할 수 있다면 종료 태그를 무시하고 정말로 감사하게 될 것입니다.

나는 또한 완전한 웹 페이지의 주변 HTML 내에서 div1의 id로 div를 먼저 찾아야한다고 언급해야한다.

실제 노드가 특정 HtmlDocument 에서 나온 노드와 참조 평등을 가질 필요는 없습니다. 단지 내용면에서 동일해야합니다.

수락 된 답변

HtmlNode 인스턴스가 반환되면 동일한 노드에 대한 여러 호출이 동일한 참조를 생성합니다. 이것을 당신의 장점으로 사용할 수 있습니다 (구현의 세부 사항이기 때문에 조심하십시오).

기본적으로, 문제의 노드까지 요소 인 모든 하위 항목을 가져옵니다. 다음에서 시작할 노드를 선택합니다.

HtmlNode divNode = doc.DocumentNode.SelectSingleNode("div[@id='div1']");

이동하려는 노드 :

// Note that in this case, working off the first node is not necessary, just
// convenient for this example.
HtmlNode brNode = divNode.SelectSingleNode("br");

그런 다음 Enumerable 클래스TakeWhile 확장 메서드 를 사용하여 두 번째 요소까지 모든 요소를 ​​가져옵니다.

// The nodes.
IEnumerable<HtmlNode> nodes = divNode.Descendants().
    TakeWhile(n => n != brNode).
    Where(n => n.NodeType == HtmlNodeType.Element);

이는 참조 비교 (구현 세부 사항 부분)에 따라 달라지는 TakeWhile 메소드 ( n => n != brNode )의 비교입니다.

마지막 필터는 SelectSingleNode 를 호출 할 때 일반적으로 얻을 수있는 요소 노드를 제공하는 것입니다. 다른 노드 유형을 처리하려는 경우이를 생략 할 수 있습니다.

다음과 같은 노드를 순환합니다.

foreach (HtmlNode node in nodes)
{
    // Print.
    Console.WriteLine("Node: {0}", node.Name);
}  

생산 :

Node: strong
Node: font
Node: font


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