C#实现的全国主要城市公交线路下载器

来源:互联网 发布:神作 知乎 编辑:程序博客网 时间:2024/04/30 14:25
在深圳这种地方,经常坐公交车一坐都是几个小时,不知道还有多长时间到站,去看车顶那牌子又不太方便,所以想要是能放到手机上看就好了。

没事就用.net把写了个小软件,可以把深圳(广州 东莞 佛山 上海 北京 武汉 南京 杭州 苏州 天津 沈阳 大连 重庆 成都 西安 郑州 惠州 )等城市的公交线路下载到手机上,这样也能方便的查找路线,毕竟不是所有人都用智能手机上网。

关键代码:
正则根据class查找div的源码
  1. public static MatchCollection GetDivByClassName(string strClass, string source)
  2.         {
  3.             Regex reg = new Regex(@"(?is)<div(?:(?!class=).)*class=(['""]?)" + strClass + @"\1[^>]*>(?><div[^>]*>(?<Open>)|</div>(?<-Open>)|(?:(?!</?div\b).)*)*(?(Open)(?!))</div>");
  4.             return reg.Matches(source);
  5.         }
复制代码
下载的代码如下:

首先下载页面的html源代码,然后查找这个页面的所有公交路线
然后找路线的名字、票价、具体站点、是否有备注,
  1. try
  2.             {
  3.                 string strFormat = txtURLFormat.Text, strHTML, strBusNum, strServiceInfo, strRoute, strPs, strSavePath, strSN = comboBox1.Items.Count > 0 ? dt.Rows[comboBox1.SelectedIndex]["sn"].ToString() : "sz";
  4.                 int iStart = int.Parse(txtStart.Text), iEnd = int.Parse(txtEnd.Text);                
  5.                 StringBuilder sbResult = new StringBuilder();
  6.                 Regex regBusNum = new Regex("(?is)<a(?>[^>]+)>(?<busNum>[^<]*)</a>", RegexOptions.Compiled);
  7.                 MatchCollection matItems, matDetail;
  8.                 WebClient webDownloader = new WebClient();
  9.                 Thread thread = new Thread(new ThreadStart(delegate()
  10.                 {
  11.                     for (int i = iStart; i <= iEnd; i++)
  12.                     {
  13.                         btnDownload.Text = string.Format("正在下载({0}/{1})...", i - iStart + 1, iEnd - iStart + 1);
  14.                         try
  15.                         {
  16.                             strHTML = webDownloader.DownloadString(string.Format(strFormat, i));//获取网页源文件 
  17.                         }
  18.                         catch (Exception ee) { ShowException(ee); return; }
  19.                         strHTML = RegexHelper.GetDivByClassName("w720 fleft", strHTML)[0].Value;//所有路线的父容器,因为下面有个class为border的div
  20.                         matItems = RegexHelper.GetDivByClassName(strSN=="sz"?"border":"bd_ddd", strHTML);//获取 路线  ,深圳的跟其它的不一样
  21.                         foreach (Match item in matItems)
  22.                         {
  23.                             strHTML = item.Value;
  24.                             strBusNum = regBusNum.Match(strHTML).Groups["busNum"].Value;//公交车次
  25.                             matDetail = RegexHelper.GetDivByClassName("pad8lr lh24", strHTML);
  26.                             strServiceInfo = RegexHelper.RemoveWhitespace(RegexHelper.RemoveMarkup(matDetail[0].Value), " ");//运营时间和票价
  27.                             strRoute = RegexHelper.RemoveMarkup(matDetail[1].Value);//具体路线
  28.                             strPs = RegexHelper.RemoveWhitespace(RegexHelper.RemoveMarkup(matDetail[3].Value.IndexOf("备注") != -1 ? matDetail[3].Value  : string.Empty));//备注就获取

  29.                             sbResult.AppendFormat("\n{0}\n{1}\n{2}\n{3}", strBusNum, strServiceInfo, strRoute, strPs==string.Empty?string.Empty:strPs+"\n");
  30.                         }
  31.                     }
  32.                     btnDownload.Text = string.Format("下载已完成!");

  33.                     strSavePath = Path.Combine(Application.StartupPath, string.Format("bus_route_{0}.txt",strSN));
  34.                     StreamWriter sw = new StreamWriter(strSavePath, false, Encoding.Default);
  35.                     sw.WriteLine(sbResult.ToString());
  36.                     sw.Close();

  37.                     sbResult.Insert(0, string.Format("(文件已经保存在:{0})\n\n", strSavePath));
  38.                     rtbResult.Text = sbResult.ToString();
  39.                 }));
  40.                 thread.IsBackground = true;
  41.                 thread.Start();
  42.             }
  43.             catch (Exception ex)
  44.             {
  45.                 ShowException(ex);                
  46.             }
复制代码
界面截图:

下载程序:
BusRouteSearch.rar
原创粉丝点击