DHL 快递跟踪查询
思路描述:主要使用正则表达式解析。
返回一个跟踪步骤列表。
- public
class TrackingData - {
- public
string time { get; set; } - public
string context { get; set; } - }
- public
class DHLExpressTrackingHelper - {
- private
static
string urlFormat = "http://webtrack.dhlglobalmail.com/?trackingnumber={0}"; - public
static List<TrackingData> GetTrackingData(string trackCode) - {
- //trackCode = "A150529020091";
- WebMocker dhlMocker = new WebMocker();
- var url = string.Format(urlFormat, trackCode);
- var html = dhlMocker.Get(url);
- //1
- var patternOLTag = "<ol.*?>(?<olvalue>.*?)</ol>";
- var match = Regex.Match(html, patternOLTag, RegexOptions.Multiline | RegexOptions.Singleline);
- if (match.Success)
- {
- var olValue = match.Groups["olvalue"].Value;
- return ParseTrackingData(olValue);
- }
- return
new List<TrackingData>(); - }
- private
static List<TrackingData> ParseTrackingData(string olValue) - {
- var patternLITag = "<li.*? class=\"(?<className>.*?)\".*?>(?<content>.*?)</li>";
- var list = new List<TrackingData>();
- string datePrefix = null;
- foreach (Match item in Regex.Matches(olValue, patternLITag, RegexOptions.Singleline | RegexOptions.Multiline | RegexOptions.IgnoreCase))
- {
- var className = item.Groups["className"].Value;
- var content = item.Groups["content"].Value;
- if (className == "timeline-date")
- {
- datePrefix = content;
- }
- else
if (className.Contains("timeline-event")) - {
- var pp = "<div.*?class=\"(?<divClassName>.*?)\".*?>(?<divContent>.*?)</div>";
- TrackingData trackingData = null;
- foreach (Match subItem in Regex.Matches(content, pp, RegexOptions.Singleline | RegexOptions.Multiline | RegexOptions.IgnoreCase))
- {
- var divClassName = subItem.Groups["divClassName"].Value.Trim();
- var subContent = subItem.Groups["divContent"].Value.Trim();
- if (divClassName == "timeline-time")
- {
- subContent = Regex.Replace(subContent, "<[^<]*>", "");
- trackingData = new TrackingData();
- trackingData.time = datePrefix + "
" + subContent; - }
- else
if (divClassName == "timeline-location") - {
- trackingData.context += subContent + "
"; - }
- else
if (divClassName == "timeline-description") - {
- trackingData.context += subContent + "
"; - }
- //else if (divClassName == "timeline-location timeline-location-responsive")
- //{
- // trackingData.Description += subContent;
- //}
- }
- list.Add(trackingData);
- }
- }
- //foreach (var item in list)
- //{
- // Console.WriteLine(item.DateString + "--" + item.Description);
- //}
- return list;
- }
- }
DHL 快递跟踪查询的更多相关文章
- 阿里云全国快递物流查询api接口
口地址: https://market.aliyun.com/products/56928004/cmapi021863.html?spm=5176.730005.productlist.d_cmap ...
- C#快递跟踪(基于快递100深度定制)
本文主要介绍快递跟踪的相关信息.如根据快递单号预测所属快递公司,判断快递是否已被签收,以及改良官方model后可在不用申请授权的情况下实现json,html,xml及text等多种格式以及单行多行,降 ...
- (24)ASP.NET Core EF查询(查询的工作原理、跟踪与非跟踪查询)
1.查询生命周期 在进入正题时候,我们先来了解EF Core查询的生命周期. 1.1LINQ查询会由Entity Framework Core处理并生成给数据库提供程序可处理的表示形式(说白了就是生成 ...
- 【VBA研究】VBA通过HTTP协议实现邮件轨迹跟踪查询
作者:iamlasong 1.接口说明 通过互联网訪问,运单跟踪信息查询接口基于HTTP协议开发,接口为RESTFul风格的Web Service,信息交互过程为用户按我方提供的web service ...
- 微信小程序调用快递物流查询API的实现方法
一. 创建index.wxml.index.wxss.index.js 附上代码: <view class='container'> <input class='info' plac ...
- .netcore 写快递100的快递物流信息查询接口
快递100的物流信息查询接口,官方提供了一些demo;还好官方提供的代码是.netcore版本写的,不过写的有点low;根据官方提供的代码,我按照.netcore 的风格重构了代码:核心代码如下: / ...
- APISpace 全球快递物流查询API接口 免费好用
前言 随着我国电子商务的迅猛发展,物流行业也开始突飞猛进,人们的日常生活越来越离不开快递服务,查快递.寄快递的需求越来越大,随之而来,常用快递接口的需求也越来越大. 全国快递查询接口,支持各大快递 ...
- 数据库SQL调优的几种方式 EFcore读的情况下使用 AsNoTracking非跟踪查询
不要用GUID 当主键 没有规律 可以用雪花ID DBA 优化法则 硬件资源是根本,DBA是为了充分利用硬件资源 一般清空下可以不使用外键 可以提高性能 合理使用临时表 临时表分页; 一些查询语句加w ...
- c#读取快递100查询返回的JSON信息
{"message":"ok","nu":"1105016801203","companytype" ...
随机推荐
- SQL Server 查询时间段内数据
方式一: ALTER Proc [dbo].[usp_Rpt_AcctTypeAudit] @FromDate datetime=null, -- yyyy-mm-dd (may change in ...
- Linux(Ubuntu)之设定开机自启动
分两种:对自建脚本,对已安装服务 对已安装服务, 只需在/etc/rc.local中添加相应的启动命令,如: 重启后,即可自启动服务. 对自建脚本自启动: 创建脚本test,修改其权限为755,如: ...
- Git的一些实用操作
Ref:http://stackoverflow.com/questions/17195861/undo-git-update-index-assume-unchanged-file 1. 添加本地忽 ...
- iOS中的两种主要架构及其优缺点浅析
凡是程序的开发者,应该对程序的架构都不陌生.一个程序的架构的好坏对这个程序有着非常重要的作用.今天我们来看一下iOS开发中用要的两种主流的程序架构.这个过程中我们主要以例子的形式展开. 我们来看第一种 ...
- DB2 for Z/os Statement prepare
The PREPARE statement creates an executable SQL statement from a string form of the statement. The c ...
- 动手动脑及java程序之用消息框进行数的运算
动手动脑 自信成就人生 动手动脑1 ✿仔细阅读示例: EnumTest.java,运行它,分析运行结果? package demo; public class Test { publi ...
- mysql编码设置
一:mysql字符集 mysql的字符集支持(Character Set Support)有两个类型:字符集(Character set)和连接校对(Collation).对于字符集的支持细化到四个层 ...
- Delphi中exit、break、continue等跳出操作的区别
Delphi中表示跳出的有break,continue,abort,exit,halt,runerror等 1.break 强制退出最近的一层循环(注意:只能放在循环里:而且是只能跳出最近的一层循环) ...
- 3-1创建Sql Sever数据库登录名
登录名:连接Sql Sever 服务器 数据库用户名: Sql Sever 的使用者 每个用来登录Sql Sever 的账户都是一个用户. 同一个数据库可以拥有多个用户,每一个用户也同时可以访问多个数 ...
- android 入门-使用adb安装及卸载apk
我想用adb 安装apk 到设备上现在出现了2个. 提示我没有找到设备 安装不用进去adb shell 这是你存放apk文件夹路径 下面安装apk到手机上(usb一定要连接成功否则读取不到手机 ...