1

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

        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,我会在页面上看到多次列出的图像,例如:

<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 的最佳方法是什么?

4

2 回答 2

1

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

于 2015-05-04T23:29:28.657 回答
0

如果要进行大量 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=\"", "\">");
于 2015-05-04T23:43:18.233 回答