篮球爱好和程序的结合:C#生成NBA赛事预告页面
一直看博客园的文章,也没有写篇文章开张下。今天总结下自己最近闲暇时间做的一个NBA赛事预告的页面的程序,也许会比较乱,请大家撮合看吧。
我是一名篮球爱好者,一直关注NBA,就要去赛事预告的网站去看看最近都有哪些比赛要进行,我非常喜欢热火队,是韦德的球迷,欢迎篮球爱好者一块交流交流。好了不扯篮球了,说说我的程序吧。我是用C#的WebBrowser来采集比赛信息的(不用自己往页面添加比赛信息,因为那个实时性比较强,比较麻烦),用程序生成HTML页面,挂到网上。
我用WebBrowser去访问http://nba.sports.sina.com.cn/match_result.php,新浪的比赛预告页面,获取页面元素并解析
public static List<MatchAdByDay> GetMatchAdvanceList(int count,out int result) { List<MatchAdByDay> MatchDayList = new List<MatchAdByDay>(); WebBrowser mybrowser = new WebBrowser(); mybrowser.Navigate("http://nba.sports.sina.com.cn/match_result.php"); //比赛预告网站 WebBrowser mybrowser2 = new WebBrowser(); mybrowser2.Navigate("http://www.fengyunzhibo.com/play-list"); //风云直播网站 while(mybrowser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } while (mybrowser2.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } try { HtmlElement element = mybrowser.Document.GetElementById("table980middle"); HtmlElementCollection list = element.GetElementsByTagName("tr"); List<string> NBAList = new List<string>(); int a = 0; foreach (var v in list) { HtmlElement e = v as HtmlElement; string s = e.InnerText; if (s.Contains("星期")) { HtmlElement td = e.GetElementsByTagName("td")[0];//直播时间 NBAList.Add(td.InnerText); a += 1; } else { var tds = e.GetElementsByTagName("td"); NBAList[a - 1] = string.Format("{0}@{1},{2},{3},{4},{5},{6},{7}", NBAList[a - 1], tds[0].InnerText, tds[2].InnerText, string.Format(@"{0}&{1}", tds[3].InnerText, tds[3].GetElementsByTagName("a")[0].GetAttribute("href")), tds[4].InnerText, string.Format(@"{0}&{1}", tds[8].InnerText, tds[8].GetElementsByTagName("a")[0].GetAttribute("href")), string.Format(@"{0}&{1}", tds[7].InnerText, tds[7].GetElementsByTagName("a")[0].GetAttribute("href")), tds[11].InnerText); } } for (int j = 0; j < count; j++) //只显示count天 { MatchAdByDay entity = new MatchAdByDay(); MatchDayList.Add(entity); } for (int j = 0; j < count; j++) { List<MatchAdModel> MatchList = new List<MatchAdModel>(); string[] matchs = NBAList[j].Split('@'); string matchDate = matchs[0]; for (int i = 1; i < matchs.Length; i++) { MatchAdModel model = new MatchAdModel(); model.MatchDate = matchDate; string[] ls = matchs[i].Split(','); model.MatchTime = ls[0]; model.Away = ls[1]; model.MatchScore = ls[2].Split('&')[0]; model.MatchScoreHref = ls[2].Split('&')[1]; model.Home = ls[3]; model.MatchData = ls[4].Split('&')[0]; model.MatchDataHref = ls[4].Split('&')[1]; model.WordLive = "战报/图文直播"; model.WordLiveAddress = ls[5].Split('&')[1]; #region 视频直播 switch (ls[6]) { case "新浪体育": MatchLiveModel live = new MatchLiveModel(); List<MatchLiveModel> liveList = new List<MatchLiveModel>(); live.Title = "新浪直播"; live.Address = "http://live.video.sina.com.cn/room/nba"; liveList.Add(live); model.Lives = liveList; break; case "中央五套": MatchLiveModel live2 = new MatchLiveModel(); List<MatchLiveModel> liveList2 = new List<MatchLiveModel>(); live2.Title = "CCTV5"; live2.Address = "http://2012.cntv.cn/live/CCTV5/index.shtml"; live2.Address2 = "http://sports.cntv.cn/live/cctv5/index.shtml"; live2.Address3 = "http://tv.qqst.com/fy/cctv5.htm"; liveList2.Add(live2); model.Lives = liveList2; break; default: model.Lives = new List<MatchLiveModel>(); break; } #endregion #region 获取风云直播直播列表 if (j < 2) { HtmlElement ele = mybrowser2.Document.GetElementById("content"); HtmlElementCollection l = ele.GetElementsByTagName("ul")[j].GetElementsByTagName("li"); foreach (var m in l) { HtmlElement e = m as HtmlElement; string fyLaber = e.GetElementsByTagName("label")[1].InnerText.Trim().Replace(" ", ""); if (fyLaber.Contains(string.Format("{0}-{1}", model.Home, model.Away))) { MatchLiveModel live = new MatchLiveModel(); HtmlElementCollection ha = e.GetElementsByTagName("a"); live.Title = ha[0].InnerText; live.Address = ha[0].GetAttribute("href"); if (model.Lives != null) { model.Lives.Add(live); } } } } #endregion MatchList.Add(model); } MatchDayList[j].MatchDayList = MatchList; } result = 0; } catch { result = 1; } return MatchDayList; }
解析人家的页面获取比赛预告对象后,就开始生成HTML了
我把这个主要的类给贴出来,写的很乱。说说自己遇到的问题和解决办法:
1:好多NBA爱好者看预告,其中的直播信息是很重要的,可以看看那场比赛有没有电视转播,视频转播,但新浪那个网站只有直播球队,时间,比分等信息,直播信息不全,这个可不行,咋办,我想到了风云直播,我就要解析他的页面了,我可以利用时间和球队名称来匹配那场比赛,然后找出他的直播列表,放入对象中,这样就实现了直播信息的添加。
2:为了美观我想把比赛球队加上图标,图标我已经下载到本地,网络获取的球队都是中文,第一次我就用中文命名图片,来显示图片,可是放到服务器上出问题呢,图片不显示,人家不识别中文啊,我只好利用方法把中文转成拼音,然后图片改成拼音命名,然后就显示出来了。下面是中文转拼音的代码:
/// <summary> /// 汉字转换成字母 /// </summary> public static string ToSpell(this string str_Chinese) { try { Hashtable t = hb(); byte[] b = System.Text.Encoding.Default.GetBytes(str_Chinese); int p; StringBuilder ret = new StringBuilder(); for (int i = 0; i < b.Length; i++) { p = (int)b[i]; if (p > 128) { p = p * 256 + b[++i] - 65536; ret.Append(g(t, p)); } else { ret.Append((char)p); } } t.Clear(); return ret.ToString(); } catch { return ""; } }
这样页面就生成出来了
好了就介绍这里了,没啥技术含量,就是利用自己的爱好做点小东西而已,希望大家提意见和建议。网站已经挂到网上,希望篮球爱好者支持下:http://www.5ailanqiu.com/