我正在使用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
。
我已经看到了很多正则表达式的答案,但我无法让它为我工作。
如果有人可以提供帮助,我会非常感激。
答案 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();