HtmlAgilityPack C # --- Selectnodes 항상 Null을 반환합니다.

c# html-agility-pack html-parsing xpath

문제

이것은 HtmlAgilityPack C # 파서와 함께 사용하려고 시도한 xpath 텍스트입니다.

//div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt']

나는 xpath 표현식을 firefox xpath add = on으로 평가하려고 시도하고 필요한 항목을 성공적으로 얻었다. 그러나 C # 코드는 Null 예외를 반환합니다.

HtmlAgilityPack.HtmlNodeCollection node = htmldoc.DocumentNode.SelectNodes("//div[@id ='sc1']/table/tbody/tr/td/span[@class='blacktxt']");            
MessageBox.Show(node.ToString());

노드는 항상 null 값을 포함하고 있습니다 ... 제발이 문제를 해결하는 방법을 찾도록 도와주세요 ... 고맙습니다 ..

인기 답변

DOM에 <tbody/> 태그 삽입 필요

XPath 표현식을 작성하기위한 모든 공통 브라우저 확장은 DOM에서 작동합니다. HTML 사양과는 달리 DOM 사양에서는 <tr/> 요소가 <tbody/> 요소 안에 있어야하므로 브라우저는 누락 된 경우 이러한 요소를 추가합니다. Firebug (또는 DOM에서 작동하는 비슷한 개발자 도구)와 페이지 소스 (필요한 경우 아무 것도 해석하지 않는 wget 또는 유사한 도구 사용)를 사용하여 HTML 소스를 보면 쉽게 차이점을 볼 수 있습니다.

해결책

/tbody 축 단계를 제거하면 XPath 표현식이 제대로 작동합니다.

//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt']

<tbody/> 태그가 <tbody/> 없는 HTML을 모두 지원 <tbody/>

보다 일반적인 해결책으로, /tbody 축 단계를 decendant-or-self 단계로 대체 할 수 있습니다. // 그러나 이것은 "내부 테이블"로 점프 할 수 있습니다.

//div[@id = 'sc1']/table//tr/td/span[@class='blacktxt']

대체 XPath 표현식을 사용하는 것이 더 좋습니다.

//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt'] | //div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt'] 

더 깔끔한 XPath 2.0 전용 솔루션이 될 것입니다.

//div[@id = 'sc1']/table/(tbody, self::*)/tr/td/span[@class='blacktxt']


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