2009-03-17 6 views
45

복잡한 웹 페이지의 테이블을 구문 분석하기 위해 HTML 민첩성 팩을 사용하고 싶지만 개체 모델에서 어떻게 든 사라졌습니다.HTML 민첩성 팩 - 구문 분석 테이블

링크 예제를 살펴 보았지만 이런 식으로 테이블 데이터를 찾지 못했습니다. XPath를 사용하여 테이블을 가져올 수 있습니까? 기본적으로 테이블을 가져 오는 방법에 대한 데이터를로드 한 후에 기본적으로 손실됩니다. 이전에 Perl에서이 작업을 수행했지만 조금 어색했지만 작업했습니다. (HTML::TableParser).

구문 분석을 위해 올바른 개체 순서를 밝힐 수 있다면 기쁘게 생각합니다.

답변

96

어떻게 같은 약 : 나는했습니다

var query = from table in doc.DocumentNode.SelectNodes("//table").Cast<HtmlNode>() 
      from row in table.SelectNodes("tr").Cast<HtmlNode>() 
      from cell in row.SelectNodes("th|td").Cast<HtmlNode>() 
      select new {Table = table.Id, CellText = cell.InnerText}; 

foreach(var cell in query) { 
    Console.WriteLine("{0}: {1}", cell.Table, cell.CellText); 
} 
+1

안녕하세요. 큰 파일을 파싱하는 것에 대한 조언을 부탁해 주시겠습니까? 50 MB 파일을 초과하여 하위 tr 노드를 가져올 수 없습니다. –

+0

@Marc - 테이블이 페이징이면 긁어서 다음 페이지로가는 방법 –

+0

@Dark_Knight 원본 페이지가 사용 된 모든 아약스 경로를 타격해야합니다. –

31

가장 간단한 무엇을 : 당신이 원하는 경우에 당신이 LINQ - 투 - 객체가 예뻐 할 수 HTML Agility Pack

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>"); 
foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table")) { 
    Console.WriteLine("Found: " + table.Id); 
    foreach (HtmlNode row in table.SelectNodes("tr")) { 
     Console.WriteLine("row"); 
     foreach (HtmlNode cell in row.SelectNodes("th|td")) { 
      Console.WriteLine("cell: " + cell.InnerText); 
     } 
    } 
} 

사용 참고 특정 요소에 대한 XPath를 얻으려면 Firefox 용 FireBug 확장 프로그램을 설치해야합니다. 사이트/웹 페이지 F12를 눌러 파이어 버그를 불러옵니다. 오른쪽을 선택하고 쿼리 할 페이지에서 요소를 선택하고 "Inspect Element"를 선택합니다. Firebug는 IDE에서 요소를 선택한 다음 Firebug에서 요소를 마우스 오른쪽 단추로 클릭하고 "XPath 복사"를 선택하면이 함수는 정확한 XPath를 제공합니다 HTML 민첩성 라이브러리를 사용하여 원하는 요소를 가져와야하는지 쿼리하십시오. 대답은 위에서

+3

을 누락 된 경우

에 추가하는 것처럼 브라우저에서 HTML의 DOM을 약간 변경하는 경우가 있습니다. html을 분석 할 때 기본적으로 Html Agility Pack에는 및