思路描述:主要使用正则表达式解析。

返回一个跟踪步骤列表。

  1. public
    class TrackingData
  2.     {
  3.         public
    string time { get; set; }
  4.         public
    string context { get; set; }
  5.     }
  6.  
  7.     public
    class DHLExpressTrackingHelper
  8.     {
  9.         private
    static
    string urlFormat = "http://webtrack.dhlglobalmail.com/?trackingnumber={0}";
  10.  
  11.         public
    static List<TrackingData> GetTrackingData(string trackCode)
  12.         {
  13.             //trackCode = "A150529020091";
  14.             WebMocker dhlMocker = new WebMocker();
  15.             var url = string.Format(urlFormat, trackCode);
  16.             var html = dhlMocker.Get(url);
  17.  
  18.             //1
  19.             var patternOLTag = "<ol.*?>(?<olvalue>.*?)</ol>";
  20.             var match = Regex.Match(html, patternOLTag, RegexOptions.Multiline | RegexOptions.Singleline);
  21.             if (match.Success)
  22.             {
  23.                 var olValue = match.Groups["olvalue"].Value;
  24.                 return ParseTrackingData(olValue);
  25.             }
  26.  
  27.             return
    new List<TrackingData>();
  28.         }
  29.  
  30.         private
    static List<TrackingData> ParseTrackingData(string olValue)
  31.         {
  32.             var patternLITag = "<li.*? class=\"(?<className>.*?)\".*?>(?<content>.*?)</li>";
  33.  
  34.             var list = new List<TrackingData>();
  35.  
  36.             string datePrefix = null;
  37.  
  38.             foreach (Match item in Regex.Matches(olValue, patternLITag, RegexOptions.Singleline | RegexOptions.Multiline | RegexOptions.IgnoreCase))
  39.             {
  40.                 var className = item.Groups["className"].Value;
  41.                 var content = item.Groups["content"].Value;
  42.                 if (className == "timeline-date")
  43.                 {
  44.                     datePrefix = content;
  45.                 }
  46.                 else
    if (className.Contains("timeline-event"))
  47.                 {
  48.                     var pp = "<div.*?class=\"(?<divClassName>.*?)\".*?>(?<divContent>.*?)</div>";
  49.  
  50.                     TrackingData trackingData = null;
  51.  
  52.                     foreach (Match subItem in Regex.Matches(content, pp, RegexOptions.Singleline | RegexOptions.Multiline | RegexOptions.IgnoreCase))
  53.                     {
  54.                         var divClassName = subItem.Groups["divClassName"].Value.Trim();
  55.                         var subContent = subItem.Groups["divContent"].Value.Trim();
  56.                         if (divClassName == "timeline-time")
  57.                         {
  58.                             subContent = Regex.Replace(subContent, "<[^<]*>", "");
  59.                             trackingData = new TrackingData();
  60.                             trackingData.time = datePrefix + "
    " + subContent;
  61.                         }
  62.                         else
    if (divClassName == "timeline-location")
  63.                         {
  64.                             trackingData.context += subContent + "
    ";
  65.                         }
  66.                         else
    if (divClassName == "timeline-description")
  67.                         {
  68.                             trackingData.context += subContent + "
    ";
  69.                         }
  70.                         //else if (divClassName == "timeline-location timeline-location-responsive")
  71.                         //{
  72.                         // trackingData.Description += subContent;
  73.                         //}
  74.                     }
  75.  
  76.                     list.Add(trackingData);
  77.                 }
  78.             }
  79.  
  80.             //foreach (var item in list)
  81.             //{
  82.             // Console.WriteLine(item.DateString + "--" + item.Description);
  83.             //}
  84.             return list;
  85.         }
  86.     }

DHL 快递跟踪查询的更多相关文章

  1. 阿里云全国快递物流查询api接口

    口地址: https://market.aliyun.com/products/56928004/cmapi021863.html?spm=5176.730005.productlist.d_cmap ...

  2. C#快递跟踪(基于快递100深度定制)

    本文主要介绍快递跟踪的相关信息.如根据快递单号预测所属快递公司,判断快递是否已被签收,以及改良官方model后可在不用申请授权的情况下实现json,html,xml及text等多种格式以及单行多行,降 ...

  3. (24)ASP.NET Core EF查询(查询的工作原理、跟踪与非跟踪查询)

    1.查询生命周期 在进入正题时候,我们先来了解EF Core查询的生命周期. 1.1LINQ查询会由Entity Framework Core处理并生成给数据库提供程序可处理的表示形式(说白了就是生成 ...

  4. 【VBA研究】VBA通过HTTP协议实现邮件轨迹跟踪查询

    作者:iamlasong 1.接口说明 通过互联网訪问,运单跟踪信息查询接口基于HTTP协议开发,接口为RESTFul风格的Web Service,信息交互过程为用户按我方提供的web service ...

  5. 微信小程序调用快递物流查询API的实现方法

    一. 创建index.wxml.index.wxss.index.js 附上代码: <view class='container'> <input class='info' plac ...

  6. .netcore 写快递100的快递物流信息查询接口

    快递100的物流信息查询接口,官方提供了一些demo;还好官方提供的代码是.netcore版本写的,不过写的有点low;根据官方提供的代码,我按照.netcore 的风格重构了代码:核心代码如下: / ...

  7. APISpace 全球快递物流查询API接口 免费好用

    前言   随着我国电子商务的迅猛发展,物流行业也开始突飞猛进,人们的日常生活越来越离不开快递服务,查快递.寄快递的需求越来越大,随之而来,常用快递接口的需求也越来越大. 全国快递查询接口,支持各大快递 ...

  8. 数据库SQL调优的几种方式 EFcore读的情况下使用 AsNoTracking非跟踪查询

    不要用GUID 当主键 没有规律 可以用雪花ID DBA 优化法则 硬件资源是根本,DBA是为了充分利用硬件资源 一般清空下可以不使用外键 可以提高性能 合理使用临时表 临时表分页; 一些查询语句加w ...

  9. c#读取快递100查询返回的JSON信息

    {"message":"ok","nu":"1105016801203","companytype" ...

随机推荐

  1. VS工程目标文件名设置

    默认的输出文件名是$(ProjectName) 可以在项目属性-配置属性-常规-目标文件名中设置 例如我想在Debug版本的输出文件加一个后缀d,那么我可以这样设置:$(ProjectName)d

  2. [Android Pro] AAR and JAR

    svn status svn log --limit 3 > RELEASE_NOTE.txt cat RELEASE_NOTE.txt pwd project_name_prefix=&quo ...

  3. python基础——调试

    python基础——调试 程序能一次写完并正常运行的概率很小,基本不超过1%.总会有各种各样的bug需要修正.有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是 ...

  4. 项目配置laungchImage

  5. Android 录音

    想要实现wav格式的编码时我们也就不能再使用MediaRecorder,而只能使用AudioRecord进行处理

  6. NYOJ题目170网络的可靠性

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAs8AAANvCAIAAACte6C6AAAgAElEQVR4nOydPbLcNhOu7yaUayGOZy

  7. IOS 开发,调用打电话,发短信,打开网址

    IOS 开发,调用打电话,发短信,打开网址   1.调用 自带mail [[UIApplication sharedApplication] openURL:[NSURL URLWithString: ...

  8. Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法

    public class SuperClass{ public void printA(){ System.out.print("SuperClass-printA"); prin ...

  9. 大话数据结构–1.基础知识+2.算法

      2.算法: 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每个指令表现为一个或多个操作. 特性:输入.输出.有穷性.确定性.可行性.   2.9.1.算法时间复杂度: 语句 ...

  10. 重温WCF之WCF传输安全(十三)(3)基于SSL的WCF对客户端验证(转)

    转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/18/2690719.html 上文我们演示了,客户端对服务器端身份的验证,这一篇来简单演示一下对 ...