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

返回一个跟踪步骤列表。

  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. 解决Idea创建maven-archetype-webapp项目无java目录的问题

    一.背景 在适用IDEA创建maven-archetype-webapp项目的时候,创建完成后发现在main文件夹下没有java源文件夹,不少小伙伴也遇到该问题,但不知道怎么解决,下面我就来分享解决步 ...

  2. NYOJ题目111分数加减法

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsEAAAKBCAIAAAA5i+FPAAAgAElEQVR4nO3dPXLbugMv7LsJ916Iay ...

  3. Oracle Redhat5.5

    http://blog.csdn.net/yakson/article/details/9012129 http://www.cnblogs.com/cnmarkao/p/3670153.html h ...

  4. 【翻译十二】java-并发之活性

    A concurrent application's ability to execute in a timely manner is known as its liveness. This sect ...

  5. SublimeText 插件

    Markdown 预览 想要预览,可以配置下面的快捷方式. { "keys": ["alt+m"], "command": "ma ...

  6. PHPCMS 实现上一篇、下一篇

    方法一:直接调用phpcms系统的函数 <div class="info"> <span>上一篇:<a href="{$previous_p ...

  7. leetcode 1_2_3_7

    来自lknny.com,欢迎交流学习!点击 tags: [leetcode,algorithm] categories: algorithm --- Two Sum Given an array of ...

  8. Sizeof与Strlen的区别与联系(转)

    Sizeof与Strlen的区别与联系 一.sizeof     sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型 ...

  9. 轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)

    hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解 ...

  10. 在Salesforce中向Page Layout中添加Visualforce Page

    在Salesforce中可以向Object所对应的Layout中添加我们自定义的Visualforce Page. 此时的Visualforce Page与Asp.Net MVC中的Partial V ...