由于工作需要,公司让我做一个关键词检测工具,就是根据关键词百度搜搜搜狗等搜索引擎查询获取排名站点地址等相关信息的一个东西。当我接到这个case的时候,首先联想的是一道面试题,就是给你一个html页面让你检索出这个页面的关键信息,这个面试题是比较简单的,就是正则的匹配,因此我也想用正则去获取。不管三七二十一,首先实现再说
其实这个已经不是最初的那个版本了,最古老的那个版本改动面目全非了,这个其实就是四条线程
去读取html然后分析 就这样实现了。
过程中遇到问题有
没有考虑清楚需求,页面分析正则维护难
解决方案一
/// <summary> /// 根据标签名称获取Html /// </summary> /// <param name="TagName">标签名称</param> /// <param name="HTML">html</param> /// <returns>返回值列表</returns> public List<string> GetHtmlTagByName(string TagName, string HTML) { HTML = Regex.Replace(HTML, @"<\s+", "<", RegexOptions.IgnoreCase); HTML = Regex.Replace(HTML, @"\s+>", ">", RegexOptions.IgnoreCase); HTML = Regex.Replace(HTML, @"</\s+", "</", RegexOptions.IgnoreCase); List<string> TagList = new List<string>(); string Tag = string.Empty; HTML = HTML.ToLower(); int TagLength = TagName.Length; int StartTagLength = TagLength + 2; int EndTagLength = TagLength + 3; List<int> IndexList = new List<int>(); for (int i = 0; i < HTML.Length; i++) { if (HTML[i] == '<') { if ((HTML.Length - i) >= StartTagLength) {//<div> | <div\s string TemTag = HTML.Substring(i, StartTagLength); if (TemTag == '<' + TagName + ' ' || TemTag == '<' + TagName + '>') { IndexList.Add(i); } } if ((HTML.Length - i) >= EndTagLength) {//</div> string TemTag = HTML.Substring(i, EndTagLength); if (TemTag == "</" + TagName + '>') { if (IndexList.Count > 0) { int S = IndexList[IndexList.Count - 1]; IndexList.Remove(IndexList[IndexList.Count - 1]);//移除最后一个 TagList.Add(HTML.Substring(S, (i - S) + EndTagLength)); } } } } } return TagList; } |
这就是一个简单的方法获取标签对之间的全部html 实现了所需要的工能,但是害怕稳定性出现问题,所以弃用
弃用之后重新考虑思路 画出流程图
这样思路更加清晰了 也考虑了配置的为题 容易修改 配置截图
做完配置以后其实就是考虑接口实现接口做出最终的版本
测试截图
整个过程中,我觉得自己出现的最大问题就是 考虑问题角度问题,我因为没有做过 就想着如何去实现,在做的过程中发现很多问题 再去扩展 最后代码相当混乱 也许一个月后我自己去修改都不能完成了。以后一定要先考虑好架构(姑且这么说啊),实现如果出现问题是可以解决的。
收获:从内部一步步往外扩展,不如从外部一步步往内部深入!
这个差不多是总结了吧,就这样了吧,我还要做代码优化。
另外如果有人需要这方面的资料 或者这个工具我都可以给你,这个只是公司工作的一个小插件吧,技术含量也没有,主要是正则 ,我们还可以交流。