当前位置:编程学习 > C#/ASP.NET >>

爬去网页内容--错误提示:并非所有的代码都返回值。


public GuoJiPrice GetGuoJiPriceInfo(string url)
        {
            try
            {
                string now = DateTime.Now.ToString("yyyy-MM-dd");
                url = string.Format("{0}_{1}_{1}_1.htm", url, now);
                string form = Http.GetHtml(url, ref cookie);//获取页面
                form = Other.GetRegValue("<tr><td((?!</tr>).)+", form);//页面内容所在区域
                MatchCollection matches = Other.GetRegValues("<td((?!</td>).)+", form);//要获取的内容
                foreach (Match m in matches)
                {
                    string a = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //获取第一个匹配到的内容
                    string b = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                    string c = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                    string d = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                  return new GuoJiPrice(a, b, c, d, now);
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }


--------------------编程问答--------------------             catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
            return null;
------------------
加上一句 --------------------编程问答-------------------- return new GuoJiPrice(a, b, c, d, now);
这是不行的。当matches为空,返回什么呢?

必须有一个写在foreach之外。 --------------------编程问答-------------------- 不确定你是要一个对象还是一个对象集合回来,如果你只返回一个集合 可以向下面这样改一下.但是感觉你应该需要返回一个集合。

public GuoJiPrice GetGuoJiPriceInfo(string url)
        {
            GuoJiPrice result=null;
            try
            {
                string now = DateTime.Now.ToString("yyyy-MM-dd");
                url = string.Format("{0}_{1}_{1}_1.htm", url, now);
                string form = Http.GetHtml(url, ref cookie);//获取页面
                form = Other.GetRegValue("<tr><td((?!</tr>).)+", form);//页面内容所在区域
                MatchCollection matches = Other.GetRegValues("<td((?!</td>).)+", form);//要获取的内容
                foreach (Match m in matches)
                {
                    string a = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //获取第一个匹配到的内容
                    string b = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                    string c = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                    string d = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                  result= GuoJiPrice(a, b, c, d, now);
                  break;
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                result=null;
            }
         retrun result;
        }
--------------------编程问答-------------------- 你这个函数是要有返回值的,但是你的程序流程不是每个分支都有返回值。 --------------------编程问答--------------------


...
string a = string.Empty;
string b = string.Empty;
string c = string.Empty;
string d = string.Empty;
 foreach (Match m in matches)
                {
                    a = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //获取第一个匹配到的内容
                     b = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                    c = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                    d = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                  
                }
return new GuoJiPrice(a, b, c, d, now);
...
--------------------编程问答-------------------- 测试了一下,发现还是只能获取到整个表格的第一行的数据。 不能循环。

我之前的代码:

public GuoJiPrice GetGuoJiPriceInfo(string url)
        {
            try
            {
                string now = DateTime.Now.ToString("yyyy-MM-dd");
                url = string.Format("{0}_{1}_{1}_1.htm", url, now);
                string form = Http.GetHtml(url, ref cookie);
                form = Other.GetRegValue("<tr><td((?!</tr>).)+", form);

                MatchCollection matches = Other.GetRegValues("<td((?!</td>).)+", form);
                string a = Other.GetRegValue(@".*", matches[1].Value);
                string b = Other.GetRegValue(@".*", matches[2].Value);
                string c = Other.GetRegValue(@".*", matches[3].Value);
                string d = Other.GetRegValue(@".*", matches[4].Value);
                return new GuoJiPrice(a, b, c, d, now);

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }


这样我能正常获取到这张表格的第一行,匹配到的4个单元格的数据。但是:假如这个表格有10行的时候,我只能读取到第一行的数据,我怎样才能读取到这整10行的数据? --------------------编程问答-------------------- 应该怎么弄? --------------------编程问答--------------------
引用楼主  的回复:
C# code


public GuoJiPrice GetGuoJiPriceInfo(string url)
        {
            try
            {
                string now = DateTime.Now.ToString("yyyy-MM-dd");
                url = string……


说句心里话,你写的这个虽然说可以,但是真不能这么写的,
怎么可以把返回值放到循环里 --------------------编程问答-------------------- 建议,循环里只进行赋值,方法最后,返回。
你现在的代码,循环进行1次就retrun了。并且若不执行循环,也没有“返回”,应该补上。

这样就不会报错了。 --------------------编程问答--------------------

public List<GuoJiPrice> GetGuoJiPriceInfo(string url)
        {
            List<GuoJiPrice> alllist=new List<GuoJiPrice>();
            GuoJiPrice result=null;
            try
            {
                string now = DateTime.Now.ToString("yyyy-MM-dd");
                url = string.Format("{0}_{1}_{1}_1.htm", url, now);
                string form = Http.GetHtml(url, ref cookie);//获取页面
                form = Other.GetRegValue("<tr><td((?!</tr>).)+", form);//页面内容所在区域
                MatchCollection matches = Other.GetRegValues("<td((?!</td>).)+", form);//要获取的内容
                foreach (Match m in matches)
                {
                    string a = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //获取第一个匹配到的内容
                    string b = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                    string c = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                    string d = m.Groups[@".*", matches[1].Value.Replace("<td align='center'> ", ""));].Value; //
                  result= GuoJiPrice(a, b, c, d, now);
                  alllist.add(result);
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                
            }
         retrun alllist;
        }


哎 有时候自己多思考思考吧 --------------------编程问答-------------------- 在 foreach 的时候 result 应该new 一下,在用之前
result= new GuoJiPrice(); --------------------编程问答-------------------- --------------------编程问答--------------------


public GuoJiPrice GetGuoJiPriceInfo(string url)
        {
            GuoJiPrice result = null;
            try
            {
                string now = DateTime.Now.ToString("yyyy-MM-dd");
                url = string.Format("{0}_{1}_{1}_1.htm", url, now);
                string form = Http.GetHtml(url, ref cookie);
                string form2 = Other.GetRegValue("<table width='100%' border='0' cellspacing='0' cellpadding='0' class='ProTab marginT'><tr((?!</table>).)+",form);
                MatchCollection trmatches = Other.GetRegValues("<tr><td((?!</tr>).)+", form2);
               foreach (Match match in trmatches)
                {
                    MatchCollection matches = Other.GetRegValues("<td((?!</td>).)+", match.Value);
                   string a = Other.GetRegValue(@".*", matches[1].Value.Replace("<td align='center'> ", ""));
                   string b = Other.GetRegValue(@".*", matches[2].Value.Replace("<td align='center'> ", ""));
                   string c = Other.GetRegValue(@".*", matches[3].Value.Replace("<td align='center'> ", ""));
                   string d = Other.GetRegValue(@".*", matches[4].Value.Replace("<td><span class='down'>", " "));
                   MessageBox.Show(a);//这里获取到了2次数据,循环。
                   result = new GuoJiPrice(a, b, c, d, now);

                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
            return result;
        }



返回写入数据库方法的时候,只获取到了一次数据,默认第一条数据

public static bool AddGuoJiPrice(int Id, int ClassId, GuoJiPrice guojiprices)//国际市场价格写入
        {
           try
            {
                MessageBox.Show(guojiprices.ZhongLiang);//这里只取到一次数据,也就是说跟没循环一样
                string sql = string.Format("insert into GuoJiJiaGe(ClassId,SmallId,Addtime,ZhongLiang,JiaGe,ChanDi,ZhangDie) values({1},{0},#{2}#)", ClassId, Id, guojiprices.AddTime);
                OleDbCommand cmd = new OleDbCommand(sql, con);
               return cmd.ExecuteNonQuery() > 0;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
        }
--------------------编程问答-------------------- 你必须要判断每一个条件,每一种情况都要有返回值。
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,