首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML字符串,获取第一个href

HTML字符串,获取第一个href
EN

Stack Overflow用户
提问于 2017-09-07 14:31:48
回答 2查看 232关注 0票数 0

我正在使用VisualStudio2015在SSIS-2016中编写一个C#脚本。

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

到目前为止,我有这样的想法:

代码语言:javascript
复制
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将如下所示:

代码语言:javascript
复制
<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

我见过很多正则表达式的答案,但我无法让它为我工作。

如果有人能帮忙,我会非常感激的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-07 14:36:17

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

考虑到您的结构,我就是这样从html中获得信息的。

代码语言:javascript
复制
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();
票数 0
EN

Stack Overflow用户

发布于 2017-09-07 15:16:43

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

testInput是您提供的示例数据。

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46099005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档