HTML字符串,获取第一个href

时间:2017-09-07 14:31:49

标签: c# html ssis

我正在使用Visual Studio-2015在SSIS-2016中编写C#脚本。

要求:从URL下载HTML并获取最早的日期(href)并将此日期设置为变量。

到目前为止我已经得到了这个:

public void Main()
{
    string username = Dts.Variables["$Package::user"].Value.ToString();
    string password = Dts.Variables["$Package::pwd"].Value.ToString();
    string URL = Dts.Variables["$Package:URL"].Value.ToString();

    WebRequest request = WebRequest.Create(URL);
    request.Credentials = new NetworkCredential(username, password);
    var webResponse = request.GetResponse();
    Stream dataStream = webResponse.GetResponseStream();
    StreamReader reader = new StreamReader(dataStream);
    string responseFromServer = reader.ReadToEnd();

因此HTML将如下所示:

<html>
    <head><title>Index of /file-download/</title></head>
    <body bgcolor="white">
    <h1>Index of /file-download/</h1><hr><pre><a href="../">../</a>
    <a href="20170826/">20170826/</a>                                          27-Aug-2017 00:05                   -
    <a href="20170827/">20170827/</a>                                          28-Aug-2017 00:05                   -
    <a href="20170828/">20170828/</a>                                          29-Aug-2017 00:05                   -
    <a href="ProductDefinitions/">ProductDefinitions/</a>                                26-Aug-2017 16:58                   -
    <a href="file-download-automation.readme.txt">file-download-automation.readme.txt</a>                12-Aug-2017 01:56                1061
    </pre><hr>
    </body>
</html>

我需要做的是以某种方式从字符串href获取最早的约会responseFromServer,然后我可以将其传递给DTS.Variable

我已经看到了很多正则表达式的答案,但我无法让它为我工作。

如果有人可以提供帮助,我会非常感激。

2 个答案:

答案 0 :(得分:0)

您可以使用HTML Agility包解析html并提取值(https://www.nuget.org/packages/HtmlAgilityPack

鉴于你的结构,这就是我设法从html获取信息的方式。

var doc = new HtmlDocument();
doc.LoadHtml(rawHtml);
var first = doc.DocumentNode.Descendants()
    .Where(_ => _.Name == "a")
    .OfType<HtmlNode>()
    .Select(_ => _.Attributes["href"])
    .Select(_ => 
    {
        try
        {
            DateTime.TryParseExact(_.Value, "yyyyMMdd/", null, DateTimeStyles.None, out var result);
            return (DateTime?)result;
        }
        catch
        {
            return null;
        }
    })
    .Where(_=> _.HasValue)
    .OrderByDescending(_ => _.Value)
    .FirstOrDefault();

答案 1 :(得分:0)

不确定这会在SSIS和您的请求范围内更好,因为这是一个包含正则表达式的示例。

testInput是您提供的示例数据

var rx = new Regex(@"<a href="".*?"">(?<date>\d{8})/</a>\s+\d{2}-.{3}-\d{4}\s(?<hh>\d{2}):(?<mm>\d{2})");
var oldest = rx.Matches(testInput).Cast<System.Text.RegularExpressions.Match>().
            Where(match => match.Success).
            Select(g =>
            {
                decimal result;
                decimal.TryParse(g.Groups["date"].Value + g.Groups["hh"].Value + g.Groups["mm"].Value, out result);
                return result;
            }
        ).Except(new[] { default(decimal) }).OrderBy(dt => dt).FirstOrDefault();