HtmlAgilityPack.HtmlNode 기반 Gettig Htmlelement

c# html html-agility-pack webbrowser-control

문제

HtmlAgilityPack을 사용하여 웹 브라우저 컨트롤의 html 문서를 파싱합니다. 원하는 HtmlNode를 찾을 수 있지만 HtmlNode를 가져온 후에 WebbrowserControl.Document에서 해당 HtmlElement를 다시 가져 오려고합니다.

실제로 HtmlAgilityPack은 라이브 문서의 오프라인 복사본을 구문 분석하는 반면 webbrowser 컨트롤의 라이브 요소에 액세스하여 currentStyle 또는 runtimeStyle 과 같은 렌더링 된 일부 속성에 액세스 runtimeStyle

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(webBrowser1.Document.Body.InnerHtml);
var some_nodes = doc.DocumentNode.SelectNodes("//p"); 
// this selection could be more sophisticated 
// and the answer shouldn't relay on it.
foreach (HtmlNode node in some_nodes)
{
   HtmlElement live_element = CorrespondingElementFromWebBrowserControl(node);
   // CorrespondingElementFromWebBrowserControl is what I am searching for
}

요소에 특정 속성이 있다면 쉽습니다. 그러나 어떤 요소에서도 작동하는 솔루션을 원합니다.

그것에 대해 내가 할 수있는 일을 도와주세요.

수락 된 답변

HtmlAgilityPack.HtmlNodeXPath 속성은 루트에서 노드까지의 경로에있는 노드를 보여줍니다. 예를 들어 \div[1]\div[2]\table[0] 입니다. 라이브 문서에서이 경로를 탐색하여 해당 라이브 요소를 찾을 수 있습니다. 그러나이 방법을 사용하기 전에 HtmlAgilityPack이 <form> 과 같은 일부 태그를 제거하면이 경로가 정확하지 않을 수 있습니다.

HtmlNode.ElementsFlags.Remove("form");

struct DocNode  
{
    public string Name;
    public int Pos;
}
///// structure to hold the name and position of each node in the path

다음 메소드는 XPath에 따라 실제 요소를 찾습니다.

HtmlNode.ElementsFlags.Remove("form");

struct DocNode  
{
    public string Name;
    public int Pos;
}
///// structure to hold the name and position of each node in the path

위에 사용 된 GetChild 메서드에 대한 코드

HtmlNode.ElementsFlags.Remove("form");

struct DocNode  
{
    public string Name;
    public int Pos;
}
///// structure to hold the name and position of each node in the path

인기 답변

HtmlAgilityPack은 실제 HTML의 노드에 직접 액세스 할 수 없습니다. 요소에 별개의 스타일 / 클래스 / ID가 없다고 말했기 때문에 수동으로 노드를 통과하고 일치하는 항목을 찾아야합니다.

HTML이 합리적으로 유효하다고 가정하면 (브라우저와 HtmlAgilityPack이 모두 정상화를 수행하므로) 두 트리의 루트에서 시작하여 동일한 하위 노드를 선택하여 요소 쌍을 처리 할 수 ​​있습니다.

기본적으로 한 트리에서 "위치 기반"XPath 노드를 만들고 다른 트리에서 선택할 수 있습니다. Xpath는 다음과 같이 보일 것입니다 (위치 또는 위치와 노드 이름에만주의를 기울이려고하는 경우에 따라 다름).

 "/*[1]/*[4]/*[2]/*[7]"
 "/body/div[2]/span[1]/p[3]"

단계 :

  1. HtmlNode 를 사용하면 루트까지 모든 부모 노드를 수집 할 수 있습니다.
  2. 브라우저에서 HTML 요소의 루트를 얻으십시오.
  3. 각 단계의 하위 노드는 해당 부모의 1 단계에서 HtmlNodes 컬렉션에있는 해당 자식의 위치를 ​​찾고 현재 라이브 노드의 하위 노드에서 실시간 HtmlElement를 찾습니다.
  4. 새로 발견 된 아이로 이동하여 찾고있는 노드까지 3 번으로 이동하십시오.



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