使用正则表达式解析html元关键字

时间:2013-05-24 15:21:43

标签: c# html regex parsing dom

我需要使用正则表达式解析html元关键字。源字符串始终采用相同的格式,如:

<meta name="description" content="description text">
<meta name="keywords" content="Keyword1, Keyword2, Keyword3...">
<link rel="alternate" type="application/xml+rss" href="http://example.com/rss">

我不会将Keyword1,Keyword2和Keyword3作为List&lt;字符串&gt;

3 个答案:

答案 0 :(得分:2)

描述

如果你正在寻找一个简单的正则表达式解决方案并且你的输入并不复杂,那么你可以试试这个

<meta\b[^>]*\bname=["]keywords["][^>]*\bcontent=(['"]?)((?:[^,>"'],?){1,})\1[>]将在内容字段中提取值。

enter image description here

组1是公开引用,然后需要在值的末尾关闭。 第2组是可以在逗号上拆分的内容。

声明

这个表达式可能会在一些简单的边缘情况下失败,这就是为什么正则表达式不应该用于解析HTML,而应该使用html解析引擎。

C#示例

using System;
using System.Text.RegularExpressions;
namespace myapp
{
  class Class1
    {
      static void Main(string[] args)
        {
          String sourcestring = "source string to match with pattern";
          Regex re = new Regex(@"<meta\b[^>]*\bname=[""]keywords[""][^>]*\bcontent=(['""]?)((?:[^,>""'],?){1,})\1[>]",RegexOptions.IgnoreCase);
          MatchCollection mc = re.Matches(sourcestring);
          int mIdx=0;
          foreach (Match m in mc)
           {
            for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
              {
                Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
              }
            mIdx++;
          }
        }
    }
}

$matches Array:
(
    [0] => Array
        (
            [0] => <meta name="keywords" content="Keyword1, Keyword2, Keyword3...">
        )

    [1] => Array
        (
            [0] => "
        )

    [2] => Array
        (
            [0] => Keyword1, Keyword2, Keyword3...
        )

)

答案 1 :(得分:1)

正则表达式不是解析HTML文件的好选择..

HTML不严格,格式也不规则..

使用htmlagilitypack

您可以使用此代码使用HtmlAgilityPack

检索所有关键字
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("http://yourWebSite.com");

List<String> keyLst= doc.DocumentNode
                        .SelectSingleNode("//meta[@name='keywords']")
                        .Attributes["content"].Value
                        .Split(',').ToList();

keyLst现在包含所有关键字

答案 2 :(得分:0)

我希望我可以发表评论,而不是将其作为答案提交,但我的代表太低了:(

我理解有时需要执行正则表达式,但正如其他人所建议的那样,只使用标准的XML或HTML解析器。它在包含非预期的输入变化方面更安全,甚至可以更快。

请参阅:https://stackoverflow.com/a/701177/1002098