【问题标题】:c# get content from url like facebook and linkedin doesc# 从 url 获取内容,如 facebook 和linkedin
【发布时间】:2014-10-23 07:45:48
【问题描述】:

在将 url 发布到您的状态时,如何实现与 Facebook 和 Linkedin 相同的功能(在 C# 中)?

正如您在下面从 Linkedin 看到的,您输入一个 URL,Linkedin 会自动获取该文章的标题、图片和被截断的内容。

【问题讨论】:

标签: c# web-scraping


【解决方案1】:

我使用Html Agility Pack 来解析 HTML。它以 NuGet 包的形式提供。

如果您有这样定义的 WebPage 类:

public class WebPage
{
    public string Title { get; set; }
    public string PageUrl { get; set; }
    public string Text { get; set; }
}

您可以使用以下代码来解析 HTML:

public WebPage ParseHtml(string html, Uri uri)
{
    var document = new HtmlDocument();
    document.LoadHtml(html);

    // remove scripts
    foreach (var script in document.DocumentNode.Descendants("script").ToArray())
    {
        script.Remove();
    }

    // remove styles
    foreach (var style in document.DocumentNode.Descendants("style").ToArray())
    {
        style.Remove();
    }

    // remove comments
    foreach (var style in document.DocumentNode.Descendants("#comment").ToArray())
    {
        style.Remove();
    }

    // sometimes </form> is not removed so we have to remove it manually
    string innerText = (document.DocumentNode.InnerText ?? "").Trim().Replace("</form>", "");

    var sb = new StringBuilder();
    var lines = innerText.Split(new[] { Environment.NewLine, "\n" }, StringSplitOptions.RemoveEmptyEntries);
    foreach (var line in lines)
    {
        string trimmed = StringUtils.DecodeAndRemoveSpaces(line);
        if (!string.IsNullOrWhiteSpace(trimmed))
        {
            sb.AppendLine(trimmed);
        }
    }

    var webPage = new WebPage { PageUrl = uri.AbsoluteUri };

    var titleNode = document.DocumentNode.Descendants("title").SingleOrDefault();
    if (titleNode != null)
    {
        webPage.Title = StringUtils.DecodeAndRemoveSpaces(titleNode.InnerText ?? "");
    }

    webPage.Text = sb.ToString();

    return webPage;
}

还有 utils 类:

public class StringUtils
{
    public static string DecodeAndRemoveSpaces(string text)
    {
        var trimed = HttpUtility.HtmlDecode(text.Trim());
        trimed = trimed.Replace("\t", " ");
        // replace double spaces
        trimed = Regex.Replace(trimed, @"[ ]{2,}", " ");

        return trimed;
    }
}

用法:

public async Task Test()
{
    using (var client = new HttpClient())
    {
        var uri = new Uri("http://www.google.com");
        string html = await client.GetStringAsync(uri);

        var webPage = ParseHtml(html, uri);
    }
}

【讨论】:

  • 我是否遗漏了某些内容,或者这会解析本地 html 文件中的内容?网址呢?
  • 您需要先获取 HTML。您可以使用 HttpClient.GetStringAsync msdn.microsoft.com/en-us/library/… 然后将这个 HTML 和 Uri 发送到 ParseHtml 方法
【解决方案2】:

您可以向该 URL 发送获取请求。然后你可以获取标题、图片和内容。

您可以查看一般示例 here(向下滚动到“示例”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 2012-12-06
    • 2020-10-13
    • 1970-01-01
    • 2011-07-28
    • 2011-09-21
    • 2011-05-12
    相关资源
    最近更新 更多