2012-05-15 6 views
4
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(content); 

var nodes = doc.DocumentNode.SelectNodes("//div[@class=\"noprint res\"]/div"); 
if (nodes != null) 
{ 
    foreach (HtmlNode data in nodes) 
    { 
        // Works but not what I want 
        MessageBox.Show(data.InnerHtml); 

        // Should work ? but does not ? 
        MessageBox.Show(data.SelectSingleNode("//span[@class=\"pp-place-title\"]").InnerText); 
    } 
} 

foreach의 초기 노드 인 HTML 결과를 구문 분석하려고하는 중입니다. 예상 한대로 작동하고 필요한 항목과 일치하는 항목이 10 개 있습니다. 내가 foreach 문에 들어가SelectSingleNode는 foreach에 잘못된 결과를 반환합니다.

I 출력은 데이터 항목의 내부 HTML은 올바른 데이터를 표시하지만 SelectSingleNode가 항상 foreach 문에서 첫 번째 항목에서 데이터를 표시합니다 I 출력 경우 는 점이다 경우 정상적인 행동이나 내가 뭔가 잘못하고있는거야? 이 문제를 해결하기 위해

는이 같은 모든 데이터 항목에 대한 foreach는 내부에 새로운 HTML을 생성했다 :
HtmlAgilityPack.HtmlDocument innerDoc = new HtmlAgilityPack.HtmlDocument(); 
innerDoc.LoadHtml(data.InnerHtml); 

// Select what I need 
MessageBox.Show(innerDoc.DocumentNode.SelectSingleNode("//span[@class=\"pp-place-title\"]").InnerText); 

은 그럼 항목 데이터에 따라 올바른 얻을.

데이터를 가져 오려고 시도한 페이지가 http://maps.google.com/maps?q=consulting+loc:+US 인 경우 직접 시도하고 싶습니다.

기본적으로 회사 이름에 대한 왼쪽 열을 읽고 위 내용이 발생합니다.

답변

9

//으로 XPath 표현식을 시작하면 data 노드가 포함 된 전체 문서에서 검색하게됩니다.

".//[...]"을 사용하면 data의 노드 만 검사 할 수 있습니다.

+0

그러나 데이터 노드에만 foreach 항목이 잘못 있습니까? 왜냐하면 내가 data.InnerHtml을 사용할 때 내부의 정확한 데이터를 표시하기 때문에 데이터 노드에서 하나만 선택하는 항목의 복제본이 없기 때문입니다. – Guapo

+0

"//"로 시작하면 데이터를 검색하지 않고 데이터를 검색하고 있음을 의미합니다 .OwnerDocument. data.OwnerDocument는 모든 데이터 노드에서 동일합니다. – hvd

+0

이제 더 이해할 수있게 설명해 주셔서 감사합니다! – Guapo

관련 문제