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

返回一个跟踪步骤列表。

  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. object实现小老鼠交互

    直接使用 <p style="text-align: center; "> <object type="application/x-shockwave- ...

  2. 3dmax导出3ds具有过多要导出的面超过64k解决方法

    参考:http://blog.sina.com.cn/s/blog_7a71dd090100w3r0.html 修改器->网格编辑->ProOptimizer 选中对象, 原始模型 顶点数 ...

  3. 高校排名 加强版(codevs 2799)

    题目描述 Description 大学排名现在已经非常流行.在网上搜索可查到关于中国大学排行的各个方面的消息. 我们知道,在一大学里通常都由许多不同的"系"(专业)组成,比如计算机 ...

  4. python基础——类和实例

    python基础——类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都 ...

  5. Mac下java开发环境的搭建与开发工具的安装

    一.安装JDK 1.根据你当前环境的需要,下载相应的JDK并安装,安装步骤与其他Mac软件安装方法相同,我安装的是jdk1.8.0_74.jdk,mac中jdk1.8的默认位置:/Library/Ja ...

  6. 苹果应用 Windows 申请 普通证书 和Push 证书 Hbuilder 个推(2)

    s上一篇 讲述了android 如何打包,这一篇 看一下如何IOS下打包 在苹果上申请证书,及其麻烦,我写下来,有需要的直接拿走即可: 首先 苹果的证书分两种 一种是 development 证书,另 ...

  7. php 审核管理

    权限管理界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  8. 20.策略者模式(Stragety Pattern)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. GPT vs MBR 分区 ,,, Legacy BIOS vs UEFI BIOS

    MBR与GPT两种磁盘分区格式的区别 http://itoedr.blog.163.com/blog/static/120284297201378114053240 GPT Partition Tab ...

  10. SQLAchemy Core学习之Reflection

    如果以后万一有一个定义好了的库,可以用这种反射的方法,作常用的操作. #coding=utf-8 from datetime import datetime from sqlalchemy impor ...