【问题标题】:How to parse strings with c# in Windows 8? [closed]如何在 Windows 8 中使用 c# 解析字符串? [关闭]
【发布时间】:2013-06-08 11:27:19
【问题描述】:

我有一个包含这部分 HTML 代码的网页:

<meta property="og:type" content="photo" />
    <meta property="og:description" content="descrizione">

    <meta property="og:site_name" content="Site_Name" />
    <meta property="og:title" content="" />
    <meta property="og:image" content="http://addfsfdbyhdfsifd.jpg" />
    <meta property="og:determiner" content="a" />
    <meta property="fb:app_id" content="124024574287414" />
    <meta property="og:url" content="http://addfsfdbyhdfsifd.com" />

如何选择属性="og:image" 的内容?我需要获取该链接才能在我的应用中显示它。

【问题讨论】:

  • 你想用 C# 解析它吗?在服务器端?
  • 看看用于在 C# 中解析 Html 的 Html Agility 包htmlagilitypack.codeplex.com
  • 应该是评论...
  • 即使关闭了,标记最佳答案也是礼貌的。

标签: c# html windows-8 windows-store-apps winrt-xaml


【解决方案1】:

使用HtmlAgilityPack

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var props = doc.DocumentNode.Descendants("meta")
            .ToDictionary( m => m.Attributes["property"].Value,
                            m => m.Attributes["content"].Value);

Console.WriteLine(props["og:image"]);

【讨论】:

  • 如果有任何两个元标记具有相同的属性,这段代码会爆炸。
  • @Shlomo 是的,包含多个具有相同属性名称的元标记的 html 页面值得这样做。
  • 该页面值得拥有,该页面的开发者也值得拥有。但是解析器的开发者可能不会。
  • @Shlomo 然后 OP 可以简单地将 ToDictionary 替换为 ToLookup :)
【解决方案2】:

这里是做到这一点的万无一失的方法。

  1. 我不喜欢使用第三方库来解决小问题。顺便说一句,对敏捷包没有冒犯。它超级棒且强大。你永远不想自己解析 HTML。但这是一个很小的边缘案例!为什么要搞砸呢?
  2. 您不能确定 HTML 是否会解析,因此您需要其他内容。 XML 很诱人,但除非您 100% 肯定这是有效的 XHTML(现在什么都不是了),否则最好不要追逐它。只需将其视为字符串解析练习即可。

什么最能解析字符串? Regular Expressions,就是这样。

这是您的解决方案:

var s = @"
<meta property=""og:type"" content=""photo"" />
<meta property=""og:description"" content=""descrizione"">
<meta property=""og:site_name"" content=""Site_Name"" />
<meta property=""og:title"" content="""" />
<meta property=""og:image"" content=""http://addfsfdbyhdfsifd.jpg"" />
<meta property=""og:determiner"" content=""a"" />
<meta property=""fb:app_id"" content=""124024574287414"" />
<meta property=""og:url"" content=""http://addfsfdbyhdfsifd.com"" />";

// first define what you will look for using regex pattern syntax
var p = @"meta\s{1,}property=""og:image""\s{1,}content=""(.+)""\s{0,}/>";

// second let the regex engine use your pattern against your html string
var m = System.Text.RegularExpressions.Regex.Match(s, p);

// third pull out just the part you want from the resulting match
var g = m.Groups[1];

// forth get the value from the meta tag, specifically the og:image you wanted
var i = g.Value;

是的,就是这么简单。 Regex 也使它更可靠。

祝你好运!

【讨论】:

    【解决方案3】:

    设置 HtmlDocument 的代码:

    var s = @"
    <meta property=""og:type"" content=""photo"" />
    <meta property=""og:description"" content=""descrizione"">
    
    <meta property=""og:site_name"" content=""Site_Name"" />
    <meta property=""og:title"" content="""" />
    <meta property=""og:image"" content=""http://addfsfdbyhdfsifd.jpg"" />
    <meta property=""og:determiner"" content=""a"" />
    <meta property=""fb:app_id"" content=""124024574287414"" />
    <meta property=""og:url"" content=""http://addfsfdbyhdfsifd.com"" />";
    
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(s);
    

    找到节点,获取属性。

    var node = doc.DocumentNode.SelectNodes("//meta[@property='og:image']").FirstOrDefault();
    
    var content = node != null
        ? node.GetAttributeValue("content", string.Empty)
        : string.Empty;
    

    【讨论】:

    • XPath?什么?为什么你还在使用 XPath?
    • 它有效,是的。它可读吗?没有。有更好的方法吗?是的。
    • 随时提供更好、更易读的答案。
    • 我不同意;我挖掘 xPath。优雅而强大。如果你知道它,你可以阅读它。如果你不知道,当然很难。呃。 Lambdas、Regex、F#——你不知道的总是具有挑战性的。那个论点是愚蠢的。话虽如此,大多数 HTML 文档不会解析为 XmlDocument。
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2016-02-02
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2012-10-23
    相关资源
    最近更新 更多