我正在使用VisualStudio2015在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。
我见过很多正则表达式的答案,但我无法让它为我工作。
如果有人能帮忙,我会非常感激的。
发布于 2017-09-07 14:36:17
您可以使用HTML解析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();发布于 2017-09-07 15:16:43
不确定这在SSIS和您的请求的范围内会更好,因为这是一个包含regex的示例。
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();https://stackoverflow.com/questions/46099005
复制相似问题