0

Visual StudioとC#でHTMLを操作する方法を学ぶ最初の試み。htmlアジリティパックライブラリを使用しています。解析を行います。

このページから、このページ 内のさまざまな場所から情報を引き出して、正しくフォーマットされた文字列として保存しようとしています。

これが私の現在のコードです(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

4 に答える 4

4

元の入力HTMLソースをよく見ると、そのデータは、次の'id'属性のいずれかを持つDIVhtml要素である6つの主要なセクションで構成されていることがわかります。" incinterimdiv" " incannualdiv" " balinterimdiv" " balannualdiv" " casinterimdiv" " casannualdiv"。明らかに、これらは、四半期または年次データの損益計算書貸借対照表、およびキャッシュフローと一致します。

ここで、Html Agility Packを使用してサイトをスクレイピングする場合、Html Agility PackはHTMLを介したプレーンなXPATHをサポートしているため、XMLに依存せずにHTMLコード内の任意のノードに到達する最も簡単な方法であるXPATHを使用することをお勧めします。

XPATHは確かに学習する必要がありますが、1行で非常に多くのことを実行するため、非常にエレガントです。これは新しいクールなC#指向のXLinq構文では古風に見えるかもしれませんが:)、XPATHははるかに簡潔です。また、コードと入力HTMLの間のバインディングを単純な古い文字列に集中させ、入力ソースが進化したとき(たとえば、IDが変更されたとき)にコードが再コンパイルされないようにすることもできます。これにより、スクレイピングコードがより堅牢になり、将来にわたって利用できるようになります。XPATHバインディングをXSL(T)ファイルに入れて、HTMLをXMLとして表示されるデータに変換できるようにすることもできます。

とにかく、十分な余談:)これは、特定の行タイトルから財務データを取得できるサンプルコードと、すべての行(6つの主要セクションの1つから)からすべてのデータを取得できるサンプルコードです。

        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());
            }
        }
于 2012-06-11T12:34:01.223 に答える
0

2つのオプションがあります。1つは、HTMLページをリバースエンジニアリングし、[年次データ]をクリックしたときに実行されるJavaScriptコードを把握し、データの取得元を確認して、データを要求することです。

より堅牢な2番目のソリューションは、Seleniumなどのプラットフォームを使用することです。このプラットフォームは、実際にWebブラウザーをエミュレートし、JavaScriptを実行します。

私の知る限り、財務諸表へのCSVインターフェースはありません。おそらくYahoo! 1つあります。

于 2012-06-09T07:34:59.160 に答える
0

適切なページに移動するためにナビゲートする必要がある場合は、WatiNの使用を検討することをお勧めします。WatiNは、Webページの自動テストツールとして設計されており、選択したWebブラウザを駆動してページを取得します。また、入力フィールドを識別し、テキストボックスまたはプッシュボタンにテキストを入力することもできます。HtmlAgilityPackによく似ているので、習得するのがそれほど難しくないはずです。

于 2012-06-10T04:44:36.917 に答える
0

このアプローチには反対することを強くお勧めします。グーグルが吐き出しているHTMLは非常に不安定である可能性が高いため、必要なすべてのデータを取得するために解析アプローチを固めたとしても、1日、1週間、または1か月でHTML形式がすべて変更される可能性があり、書き直す必要があります。解析ロジック。

XBRLなど、より静的なものを使用するようにしてください。

SECは、このXBRLを上場企業ごとにここで公開しています= http://xbrl.sec.gov/

このツールキットを使用して、プログラムでデータを操作できます-http ://code.google.com/p/xbrlware/

編集:最も抵抗の少ない道は実際にはhttp://www.xignite.com/xFinancials.asmxを使用していますが、このサービスにはお金がかかります。

于 2012-06-14T15:43:32.433 に答える