2012-06-09 3 views
0

Visual Studio 및 C#에서 HTML로 학습하는 방법을 처음 배우십시오. 도서관에 html agility pack을 사용하고 있습니다. 구문 분석을 수행합니다. 나뿐만 올바르게 포맷 문자열재무 제표에서 HTML 스크랩

여기

이 페이지 내에서 여러 곳에서 정보를 뽑아 그들을 저장하려고하고이 page에서

은 내 현재 코드는 (에서 촬영 : shriek)되어

HtmlNode tdNode = document.DocumentNode.DescendantNodes().FirstOrDefault(n => n.Name == "td" 
&& n.InnerText.Trim() == "Net Income"); 
if (tdNode != null) 
{ 
    HtmlNode trNode = tdNode.ParentNode; 
    foreach (HtmlNode node in trNode.DescendantNodes().Where(n => n.NodeType ==  HtmlNodeType.Element)) 
    { 
    Console.WriteLine(node.InnerText.Trim()); 
    //Output: 
    //Net Income 
    //265.00 
    //298.00 
    //601.00 
    //672.00 
    //666.00 
    } 
} 

이 올바르게 작동하지만 더 많은 정보를 얻고 싶습니다. html을 올바르게 검색하는 방법을 잘 모릅니다. 먼저 분기 별 (연례 데이터뿐만 아니라 페이지 상단의보기 옵션)에서이 숫자를 선택할 수 있습니다.

나는 또한, 구글이 제공합니까 (이하 "현재 ..."각 열의 맨 위에있는) 미래 프로젝트도

분기 및 연간 두 숫자의 각 열에 대해 날짜를 좀하고 싶습니다 이 API는?

답변

4

원래 입력 HTML 소스를 면밀히 살펴보면 다음과 같은 'id'속성 중 하나가 포함 된 DIV html 요소 인 'incinterimdiv' 'incannualdiv' '' balinterimdiv ""balannualdiv ""casinterimdiv ""casannualdiv ". 물론,이 경기 손익 계산서, 대차 대조표Quaterly 또는 연간 데이터에 대한 현금 흐름.

이제

, 당신은 HTML을 민첩성 팩 사이트를 긁어 때, 나는 당신이 XPATH 느릅 나무는 HTML을 민첩성 팩과 같은 XML에 대한 종속성없이 HTML 코드, 내부의 모든 노드에 얻을 수있는 가장 쉬운 방법이며, 사용하는 것이 좋습니다 일반 XPATH (HTML)를 지원합니다.

XPATH는 분명히 배워야하지만, 한 줄로 많은 것을하기 때문에 매우 우아합니다. 나는 이것이 새로운 멋진 C# -oriented XLinq 문법으로 구식이 될지 모른다는 것을 안다. 그러나 XPATH는 훨씬 더 간결하다. 또한 기존의 문자열에 코드와 입력 HTML 사이의 바인딩을 집중시킬 수 있으며 입력 소스가 발전 할 때 (예 : ID가 변경된 경우) 코드를 다시 컴파일하지 않아도됩니다. 이로써 스크래핑 코드가 더욱 강력 해지고 미래 보장됩니다. XML로 표시된 데이터로 변환 할 수 있도록 XSL (T) 파일에 XPATH 바인딩을 넣을 수도 있습니다.

어쨌든, 충분히 여담 : 여기에 당신이 특정 라인 제목에서 재무 데이터를 얻을 수있는 샘플 코드이며, (6 개 주요 섹션 중 하나에서) 모든 라인에서 모든 데이터를 취하는 또 다른 :

 HtmlWeb web = new HtmlWeb(); 
     HtmlDocument doc = web.Load("http://www.google.com/finance?q=NASDAQ:TXN&fstype=ii"); 

     // How get a specific line: 
     // 1) recursively get all DIV elements with the 'id' attribute set to 'casannualdiv' 
     // 2) get all TABLE elements under, with the 'id' attribute set to 'fs-table' 
     // 3) recursively get all TD elements containing the given text (trimmed) 
     foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@id='casannualdiv']/table[@id='fs-table']//td[normalize-space(text()) = 'Deferred Taxes']")) 
     { 
      Console.WriteLine("Title:" + node.InnerHtml.Trim()); 

      // get all following sibling TD elements 
      foreach (HtmlNode sibling in node.SelectNodes("following-sibling::td")) 
      { 
       Console.WriteLine(" data:" + sibling.InnerText.Trim()); // InnerText works also for negative values 
      } 
     } 

     // How to get all lines: 
     // 1) recursively get all DIV elements with the 'id' attribute set to 'casannualdiv' 
     // 2) get all TABLE elements under, with the 'id' attribute set to 'fs-table' 
     // 3) recursively get all TD elements containing the class 'lft lm' 
     foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@id='casannualdiv']/table[@id='fs-table']//td[@class='lft lm']")) 
     { 
      Console.WriteLine("Title:" + node.InnerHtml.Trim()); 
      foreach (HtmlNode sibling in node.SelectNodes("following-sibling::td")) 
      { 
       Console.WriteLine(" data:" + sibling.InnerText.Trim()); 
      } 
     } 
+0

위대한 솔루션, 당신은 XPath의 뛰어난 사용을 보여 주었다. 감사 – lucas

0

두 가지 옵션이 있습니다. 하나는 HTML 페이지를 리버스 엔지니어링하고, Annual Data를 클릭 할 때 JavaScript 코드가 실행되는지 알아 내고, 어디에서 데이터를 가져오고 데이터를 요청하는지 확인하는 것입니다.

더 강력한 두 번째 솔루션은 실제로 웹 브라우저를 에뮬레이트하고 JavaScript를 실행하는 Selenium과 같은 플랫폼을 사용하는 것입니다.

내가 알 수있는 한, 재무 제표에는 CSV 인터페이스가 없습니다. 아마도 야후! 하나있다.

0

올바른 페이지로 이동하려면 주변을 돌아 다니면서 WatiN을 사용하는 것이 좋습니다. WatiN은 웹 페이지의 자동화 된 테스트 도구로 설계되었으며 선택한 웹 브라우저를 사용하여 페이지를 가져옵니다. 또한 입력 필드를 식별하고 텍스트 상자 또는 누름 단추에 텍스트를 입력 할 수 있습니다. HtmlAgilityPack과 매우 흡사하므로 마스터하기가 너무 어려워서는 안됩니다.

+0

크롬에 대한 두려움은 두렵다. 어느 특정 요구 나를 위해 – jth41

0

이 접근법에 대해 적극 권장합니다. Google이 뱉어내는 HTML은 매우 변동이 심하기 때문에 파싱 방식을 고수해 일단 필요한 모든 데이터를 얻으면 하루, 한 주 또는 한 달 안에 HTML 형식이 모두 바뀔 수 있으므로 다시 작성해야합니다. 파싱 ​​로직.

XBRL과 같이 더 정적 인 것을 사용해야합니다.

SEC 당신은 프로그래밍 방식으로 데이터 작업이 툴킷을 사용할 수 있습니다 http://xbrl.sec.gov/

여기에 각각 상장 기업이 XBRL = 발행 - http://code.google.com/p/xbrlware/

편집 : 최소 저항의 경로가 실제로 http://www.xignite.com/xFinancials.asmx을 사용하고 있지만, 이 서비스는 돈이 든다.