在将 url 发布到您的状态时,如何实现与 Facebook 和 Linkedin 相同的功能(在 C# 中)?
正如您在下面的 Linkedin 中看到的那样,您输入一个 URL,Linkedin 会自动获取该文章的标题、图片和截断的内容。
最佳答案
我使用 Html Agility Pack解析 HTML。它以 NuGet 包的形式提供。
如果您有一个这样定义的网页类:
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;
}
还有实用程序类:
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);
}
}
关于c# 像 facebook 和 linkedin 一样从 url 获取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26523418/