日期:2014-05-18  浏览次数:20873 次

跪求!怎样才能抓取这个网页的特定数据???
有这样一个网页:

http://stock.finance.sina.com.cn/hkstock/finance/01398.html

网页里面有四张财务报表:重要财务指标、资产负债表、现金流量表、综合损益表;
每张报表的右边都有一个“报表类型”的选择控件,用于选择报表是年报还是季报等;

现在的要求是:将报表中的年报数据抓取出来

我现在遇到的问题是:

1、不知道匹配这些报表格式的正则表达式该怎么写;
(我是菜鸟,正则几乎一窍不通,汗。。。)

2、如何处理列数不固定的问题?
由于报表的年份列数是不固定的,(因为每一家上市公司上市的时间有早有后,因此提供财务报表的数据不可能都那么齐全,有的从2000-2012年最近十几年的数据都有,而有些只有最近一两年的)因此,应该怎么处理好?是将正则表达式写多个版本保存在数据库里,要使用的时候再调出来匹配?还是可以写一个通用的正则表达式匹配动态的年份时间列?

3、如何根据报表类型的不同抓取有关的财务数据?
也就是说,比如我想要年报的数据,在网页上我是点击“报表类型”这个下拉控件,选择“年报”,此时网页就会筛选出年报的数据,抓取程序里面应该怎么样模拟这个操作,将年报的数据抓取出来?


希望哪位高手或大神能给出具体的代码,不胜感激呀,这几天我都快给这几个问题搞疯了



------解决方案--------------------
如下,得到具体的table后在利用正则处理,太长了,先写这么多
C# code

 string url = "http://stock.finance.sina.com.cn/hkstock/finance/01398.html";


                WebRequest request = WebRequest.Create(url); //请求url
                WebResponse response = request.GetResponse(); //获取url数据

                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));
                string tempStr = reader.ReadToEnd();


                //string tempStr = File.ReadAllText(@"C:\Documents and Settings\Administrator\桌面\Test.txt", Encoding.GetEncoding("GB2312"));//读取txt
                string pattern = @"(?i)<div[^>]*?class=(['""])sub01_tt fblue\1[^>]*?>[\s\S]*?<span[^>]*?class=(['""])\s*?selected\2[^>]*?><a[^>]*?>(?<title>[^<]*?)</a></span>[\s\S]*?";
                pattern += @"<div[^>]*?class=(['""])sub01_cc\3[^>]*?>[\s\S]*?(?<table>((?!</?table>)[\s\S])*</table>)";
                string tableHtml = string.Empty;
                foreach (Match m in Regex.Matches(tempStr, pattern))
                {
                    //循环输出
                    string type = m.Groups["title"].Value.Trim();
                    switch (type)
                    {
                        case "重要财务指标":
                            tableHtml = m.Groups["table"].Value;
                            break;
                        case "资产负债表":
                            tableHtml = m.Groups["table"].Value;
                            break;
                        case "现金流量表":
                            tableHtml = m.Groups["table"].Value;
                            break;
                        case "综合损益表":
                            tableHtml = m.Groups["table"].Value;
                            break;
                    }

                }

------解决方案--------------------
樓上熱心了
------解决方案--------------------
1楼的正则真是用的如火纯清啊,佩服佩服
------解决方案--------------------
楼主的问题,不是几十行代码能解决的。
需要解决的问题有:
1.年报数据是通过在列表中选择"年报",然后调用js的selectData动态从服务器取回的。
思路一:使用浏览器控件,模拟选择年报,然后使用正则从页面中匹配数据。
思路二:分析利用 selectData中返回的数据,此方法可能不需要正则,但又出现session模拟的问题
------解决方案--------------------
现在也在纠结抓取信息的问题,看到匹配数据的正则表达式脑壳都大了,
------解决方案--------------------
问题是,并不知道你想要得到的结果是什么格式的,只能匹配到table
------解决方案--------------------
先确定具体要的内容,按情况改下正则再提取