HTML Agility Pack - XPath를 사용하여 단일 노드 가져 오기 - 객체 참조가 객체의 인스턴스로 설정되지 않음

html-agility-pack xpath

문제

이것은 HAP을 사용하여 요소 값을 가져 오는 첫 번째 시도입니다. InnerText를 사용하려고 할 때 null 객체 오류가 발생합니다.

내가 근근이 다가 가고있는 URL은 다음과 같습니다. - http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013 오늘의 변화에 ​​대한 가치를 얻으려고합니다. 요약 표.

내 코드가 바닥에 있습니다. 첫째, 나는 이것이 올바른 방향으로 가고 있는지 알고 싶습니다. 그렇다면 단순히 XPath 값이 올바르지 않습니까?

XPath 값은 htmlagility 헬퍼라는 유틸리티를 사용하여 얻은 값입니다. 아래의 XPath의 방화 광 버전은 또한 동일한 오류를 제공합니다. - / html / body / div [3] / div / table / tbody / tr [3] / td / table / tbody / tr [5] / td [3 ]

내 코드 : -

WebClient myPivotsWC = new WebClient();
string nodeValue;
string htmlCode = myPivotsWC.DownloadString("http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013");
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlCode);
HtmlNode node = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[3]/div[1]/table[1]/tbody[1]/tr[3]/td[1]/table[1]/tbody[1]/tr[5]/td[3]");
nodeValue=(node.InnerText);

고마워, 윌.

수락 된 답변

FireBug 나 Chrome 등과 같은 개발 도구에 의존해서는 안됩니다. XPATH가 메모리 HTML DOM에 해당하므로 XPATH는 Html Agility Pack 서버가 보낸 원시 HTML에 대해서만 알고 있습니다.

당신이해야 할 일은 되돌아온 것을 시각적으로 보거나 (또는 ​​뷰 소스를 수행하는 것입니다.) 예를 들어 TBODY 요소가 없다는 것을 알 수 있습니다. 그래서 당신은 discriminant를 찾고 XPath 축을 사용합니다. 또한 XPATH가 작동하더라도 XPath는 문서의 변경에 매우 저항하지 않으므로 향후 문서 보호를 위해 더 안정적인 항목을 찾아야합니다.

다음은 작동하는 코드입니다.

HtmlNode node = doc.DocumentNode.SelectSingleNode("//td[@class='dnTableCell']//a[text()='High']/../../td[3]");

이것이하는 일입니다.

  • CLASS 속성이 'dnTableCell'로 설정된 TD 요소를 찾습니다. // 토큰은 검색이 XML 계층에서 재귀적임을 의미합니다.
  • 'High'와 같은 텍스트 (내부 텍스트)가 포함 된 A 요소를 찾습니다.
  • 두 부모를 위로 이동 (가장 가까운 TR 요소로 이동)
  • 거기에서 세 번째 TD 요소를 선택하십시오.

인기 답변

Simon Mourier 와 같이 서버에서 보낸 HTML을 가져 왔습니다. 필요한 요소는 아직 렌더링되지 않았으므로 DOM에 존재하지 않기 때문에 아직 검색 할 수 없습니다. 이 문제에 대한 간단한 해결 방법은 웹 렌더러를 사용하여 DOM을 작성하는 것입니다. HTML을 가져 와서 긁을 수 있습니다. 저는 WatiN을 이렇게 사용합니다 :

WatiN.Core.Settings.MakeNewInstanceVisible = false;
WatiN.Core.Settings.AutoMoveMousePointerToTopLeft = false; 
IE ie = new IE();
ie.GoTo(urlLink); 
ie.WaitForComplete();
string html = ie.Html;
ie.close();



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