如何从html页面文件中提取日期和时间?

时间:2016-12-27 20:49:46

标签: c# .net winforms

在课堂上我有:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;

namespace SatelliteImages
{
    class ExtractImages
    {
        static WebClient client;
        List<string> imagesUrls = new List<string>();
        static string htmltoextract;
        static string link;
        static string text;
        public static List<string> countriescodes = new List<string>();
        public static List<string> countriesnames = new List<string>();
        private static int lastsatimage = 0;
        private static string Next_Sat_File;
        private static string temp_sat_dir;

        public void Init()
        {
            ExtractCountires();
        }

        public static void ExtractCountires()
        {
            try
            {
                htmltoextract = "http://sat24.com/en/?ir=true";
                client = new WebClient();
                client.DownloadFile(htmltoextract, @"c:\temp\sat24.html");
                client.Dispose();

                string tag1 = "<li><a href=\"/en/";
                string tag2 = "</a></li>";

                string s = System.IO.File.ReadAllText(@"c:\temp\sat24.html");
                s = s.Substring(s.IndexOf(tag1));
                s = s.Substring(0, s.LastIndexOf(tag2) + tag2.ToCharArray().Length);
                s = s.Replace("\r", "").Replace("\n", "").Replace(" ", "");

                string[] parts = s.Split(new string[] { tag1, tag2 }, StringSplitOptions.RemoveEmptyEntries);


                string tag3 = "<li><ahref=\"/en/";

                for (int i = 0; i < parts.Length; i++)
                {
                    if (i == 17)
                    {
                        break;
                    }
                    string l = "";
                    if (parts[i].Contains(tag3))
                        l = parts[i].Replace(tag3, "");

                    string z1 = l.Substring(0, l.IndexOf('"'));
                    countriescodes.Add(z1);

                    string z2 = parts[i].Substring(parts[i].LastIndexOf('>') + 1);
                    countriesnames.Add(z2);
                }
            }
            catch (Exception e)
            {

            }
        }
    }
}

我发现在阅读文件中的sat24.html文件时,日期和时间都在html文件的这一部分中:

var arrayImageTimes = [];
arrayImageTimes.push('201612271810');arrayImageTimes.push('201612271825');arrayImageTimes.push('201612271840');arrayImageTimes.push('201612271855');arrayImageTimes.push('201612271910');arrayImageTimes.push('201612271925');arrayImageTimes.push('201612271940');arrayImageTimes.push('201612271955');arrayImageTimes.push('201612272010');arrayImageTimes.push('201612272025');

那么我想要做的是将日期和时间缩小并将它们添加到两个列表中:201612271810所以第一个列表将是这种格式。

第二个列表是日期和时间不确定格式但是:年= 2016月= 12天= 27小时= 18分= 10

我以后要做的是为每个日期和时间建立一个新链接,新链接应采用以下格式:如果我们以日期和时间201612271810为例。那么:http://www.sat24.com/image2.ashx?region=is&time=201612271810&ir=true问题是如何提取日期和时间,然后使用我的ExtractCountries方法来构建链接。 在ExtractCountries方法中,我得到两个列表,一个是国家代码,一个是国家/地区名称。

我需要建立链接的是国家/地区代码和国家/地区日期和时间。

那么我可以使用带有日期时间的代码列表,例如:

第一个列表将是html文件中格式的日期和时间:例如,第一个日期和时间是:

http://www.sat24.com/image2.ashx?region=is&time=201612271810&ir=true

Where is = Israel和201612271810是此图片链接的日期时间。 或者例如

http://www.sat24.com/image2.ashx?region=tu&time=201612271810&ir=true

地区tu是火鸡

所以我需要的是获取从所有国家代码和每个地区的所有日期和时间(countrey)建立的链接列表,以便我以后可以下载图像。

所以在列表中例如uri字符串类型或字符串列表类型将类似于前10个索引:

http://www.sat24.com/image2.ashx?region=tu&time=201612271825&ir=true
http://www.sat24.com/image2.ashx?region=tu&time=201612271840&ir=true
http://www.sat24.com/image2.ashx?region=tu&time=201612271855&ir=true
http://www.sat24.com/image2.ashx?region=tu&time=201612271910&ir=true
.
.
.
.
.
.
http://www.sat24.com/image2.ashx?region=is&time=201612271810&ir=true
http://www.sat24.com/image2.ashx?region=is&time=201612271825&ir=true
http://www.sat24.com/image2.ashx?region=is&time=201612271840&ir=true
http://www.sat24.com/image2.ashx?region=is&time=201612271910&ir=true

当前每个地区/国家/地区从sat24页面提取日期和时间。

然后在完成创建列表以下载图像时。每个链接例如:http://www.sat24.com/image2.ashx?region=is&time=201612271910&ir=true应该下载并保存为图像。

1 个答案:

答案 0 :(得分:3)

这是一个使用敏捷包从html文档中提取信息的示例。

using System;
using System.Linq;
using System.IO;
using System.Xml;
using System.Net;
using HtmlAgilityPack;

public class Program
{
    public static void Main()
    {
        var wc = new WebClient();
        wc.BaseAddress = "http://sat24.com/";
        HtmlDocument doc = new HtmlDocument();

        var temp = wc.DownloadData("/en");
        doc.Load(new MemoryStream(temp));       

        var secTokenScript = doc.DocumentNode.Descendants()
            .Where(e =>
                   String.Compare(e.Name, "script", true) == 0 &&
                   String.Compare(e.ParentNode.Name, "div", true) == 0 &&
                   e.InnerText.Length > 0 &&
                   e.InnerText.Trim().StartsWith("var region")
                  ).FirstOrDefault().InnerText;
        var securityToken = secTokenScript;
        securityToken = securityToken.Substring(0, securityToken.IndexOf("arrayImageTimes.push"));  
        securityToken = secTokenScript.Substring(securityToken.Length).Replace("arrayImageTimes.push('", "").Replace("')", "");
        var dates = securityToken.Trim().Split(new string[] { ";"}, StringSplitOptions.RemoveEmptyEntries);
        var scriptDates = dates.Select(x => new ScriptDate { DateString = x });
        foreach(var date in scriptDates) 
        {
            Console.WriteLine("Date String: '" + date.DateString + "'\tYear: '" + date.Year + "'\t Month: '" + date.Month + "'\t Day: '" + date.Day + "'\t Hours: '" + date.Hours + "'\t Minutes: '" + date.Minutes + "'");
        }

    }


    public class ScriptDate
    {
        public string DateString {get;set;}
        public int Year 
        {
            get
            {
                return Convert.ToInt32(this.DateString.Substring(0, 4));
            }
        }
        public int Month
        {
            get
            {
                return Convert.ToInt32(this.DateString.Substring(4, 2));
            }
        }
        public int Day
        {
            get
            {
                return Convert.ToInt32(this.DateString.Substring(6, 2));
            }
        }
        public int Hours
        {
            get
            {
                return Convert.ToInt32(this.DateString.Substring(8, 2));
            }
        }
        public int Minutes
        {
            get
            {
                return Convert.ToInt32(this.DateString.Substring(10, 2));
            }
        }




    }


}

我还创建了一个.Net Fiddle,表明这是有效的