在 C# 中,如何从使用 webproxy.load() 得到的 html 页面中解析出 url?

In C#, how can I parse out a url from a html page that I have got using webproxy.load()?

我正在尝试阅读当天的呆伯特图像。我可以通过这样做获得页面的全文:

        var todayDate = DateTime.Now.ToString("yyyy-MM-dd");
            var web = new HtmlWeb();
            web.UseCookies = true;
            var wp = new WebProxy("http://myproxy:8080");
            wp.UseDefaultCredentials = true;
            NetworkCredential nc = (NetworkCredential)CredentialCache.DefaultCredentials;
            HtmlDocument document = web.Load("http://www.dilbert.com/strips/comic/" + todayDate, "GET", wp, nc);

如果我查看文档的完整 html,我会看到 image 在页面上多次列出,例如:

<meta property="og:image" content="http://assets.amuniversal.com/c2168fa0c45a0132d8f0005056a9545d"/>

或:

<meta name="twitter:image" content="http://assets.amuniversal.com/c2168fa0c45a0132d8f0005056a9545d">

  <img alt="Squirrel In The Large Hadron Collider - Dilbert by Scott Adams" class="img-responsive img-comic" height="280" src="http://assets.amuniversal.com/c2168fa0c45a0132d8f0005056a9545d" width="900" />

从这张图片中解析出 URl 的最佳方法是什么?

您可以尝试使用 HtmlAgilityPack 或类似的库来解析响应的结构 HTML,然后遍历解析器生成的 DOM。

如果您要进行大量 dom 操作,您可以使用 HtmlAgilityPack,但快速而肮脏的 hack 是只使用内置的 .Net C# 字符串功能..

这是未经测试的,并且没有 IDE 但您可以尝试类似的东西:

var urlStartText = "<meta property=\"og:image\" content=\""
var urlEndText = "\"/>";
var urlStartIndex = documentHtml.IndexOf(urlStartText)+urlStartText.Length;
var url = documentHtml.Substring(urlStartIndex, documentHtml.IndexOf(urlEndText, urlStartIndex) - urlStartIndex);

想法是找到 URL 周围的 html 文本的开始和结束位置,然后使用 Substring 来获取它。你可以制作一个像 "GetStringInbetween(string startText, string endText)" 这样的方法,这样它就可以重用

编辑 **这个变成方法的例子:

/// <summary>
/// Returns the text located between the start and end text within content
/// </summary>
public static string GetStringInBetween(string content, string start, string end)
{
    var startIndex = content.IndexOf(start) + start.Length;
    return content.Substring(startIndex, content.IndexOf(end, startIndex) - startIndex);
}


string url = GetStringInbetween(documentHtml, "<meta property=\"og:image\" content=\"", "\">");