[英]Scraping HTML from Financial Statements
首先尝试学习在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?
如果仔细看一下原始的输入html源,您将看到其数据围绕着DIV html元素的6个主要部分进行组织,这些元素具有以下“ id”属性之一:“ incinterimdiv
”“ incannualdiv
”“ balinterimdiv
”“ balannualdiv
“” casinterimdiv
“” casannualdiv
“。 显然,这些匹配季度或年度数据的损益表 , 资产负债表和现金流量 。
现在,当您使用Html Agility Pack抓取网站时,建议您使用XPATH wich是到达HTML代码内任何节点的最简单方法, 而无需依赖XML ,因为Html Agility Pack支持基于HTML的纯XPATH 。
当然,必须学习XPATH,但它非常优雅,因为它只用一行就可以完成很多事情。 我知道,使用新的面向C#的超酷XLinq语法:)看起来可能是过时的,但是XPATH更为简洁。 它还使您可以将代码和输入HTML之间的绑定集中在普通的旧字符串中,并避免在输入源发生变化时(例如,在ID更改时)重新编译代码。 这使您的抓取代码更加健壮,并且面向未来。 你也可以把XPATH绑定在一个XSL(T)文件,以便能够将HTML 转换成呈现为XML数据。
无论如何,足够的题外:)这是一个示例代码,它使您可以从特定行标题中获取财务数据,而另一个示例代码可以从所有行中获取所有数据(来自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());
}
}
您有两个选择。 一种是对HTML页面进行逆向工程,找出在单击“年度数据”时运行的JavaScript代码,查看从何处获取数据并索取数据。
第二种解决方案更强大,它是使用诸如Selenium之类的平台,该平台实际上模拟Web浏览器并为您运行JavaScript。
据我所知,财务报表没有CSV界面。 也许雅虎! 有一个。
如果您需要浏览以找到正确的页面,那么您可能希望使用WatiN进行研究 。 WatiN被设计为网页的自动测试工具,并驱动选定的Web浏览器来获取页面。 它还允许您标识输入字段并在文本框或按钮中输入文本。 它非常类似于HtmlAgilityPack,因此您应该不难掌握。
我强烈建议您反对这种方法。 Google吐出的HTML可能非常不稳定,因此,即使您巩固了解析方法以获取所需的所有数据,一天,一周或一个月内,HTML格式也可能会发生变化,因此您需要重写您的解析逻辑。
您应该尝试使用更静态的内容,例如XBRL。
SEC在此处= http://xbrl.sec.gov/为每家上市公司发布此XBRL。
您可以使用此工具包以编程方式使用数据-http: //code.google.com/p/xbrlware/
编辑:阻力最小的路径实际上是使用http://www.xignite.com/xFinancials.asmx ,但是此服务要花钱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.