使用正则表达式获取html标签的变量值

时间:2012-04-10 06:52:40

标签: c# html-parsing

我试图获取某些html文本之间的值,到目前为止还没有成功,我不能使用html aglity包,因为它只提供html标签之间的数据

public static string[] split_comments(string html)
    {
        html = html.ToLower();


        html = html.Replace(@""""," ");

html中的实际行是

// <meta itemprop="rating" content="4.7"> the 4.7 value changes every time and I need to get this value

Match match = Regex.Match(html, @"<meta itemprop=rating content=([A-Za-z0-9\-]+)\>$");
            if (match.Success)
            {
                // Finally, we get the Group value and display it.
                string key = match.Groups[1].Value;
            }

所以我试图得到一个html标签,并且在那个标签中我希望得到的数据始终是可变的。

5 个答案:

答案 0 :(得分:4)

string html = "<meta itemprop=\"rating\" content=\"4.7\">";
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var content = doc.DocumentNode
                .Element("meta")
                .Attributes["content"].Value;

<强> - 编辑 -

从您第一次接受然后不接受答案开始,我猜测您接受了代码并使用真实的HTML运行,并发现它返回了错误的结果。

这并不表示答案不正确,因为它可以正常使用您发布的代码段。

通过猜测并假设您的真实html中有其他meta标记,其中itemprop属性为

<meta itemprop="rating" content="4.7">
<meta itemprop="somekey" content="somevalue">

代码将是:

var content = doc.DocumentNode
                .Descendants("meta")
                .Where(n => n.Attributes["itemprop"] != null && n.Attributes["itemprop"].Value == "rating")
                .Select(n => n.Attributes["content"].Value)
                .First();

答案 1 :(得分:2)

首先你应该替换它:

html = html.Replace(@""""," ");

与此:

html = html.Replace(@"""","");

并使用以下命令更改您的正则表达式:

Match match = Regex.Match(html, @"<meta itemprop=rating content=([A-Za-z0-9\-.]+)\>$");

否则你的if总是假的。之后,您可以简单地使用子字符串:

 html = html.Substring(html.IndexOf("content=") + 8);

 html = html.Substring(0, html.Length - 1);

我希望'帮助

答案 2 :(得分:1)

下面

html = html.Replace(@""""," "); 

用空格替换双引号。因此,您的示例字符串现在看起来像这样:

<meta itemprop= rating  content= 4.7 > 

然而,您的正则表达式与没有这些额外空格的文本匹配。此外,正则表达式在结束>之前需要反斜杠,这在示例中不存在。

答案 3 :(得分:1)

你的正则表达式应该是@"\<meta.+?content\=\"(.+)\"\>"。虽然用正则表达式解析HTML是件坏事。

答案 4 :(得分:1)

试试这个:

        double searchedValue;
        Regex reg = new Regex(@"content= (?<groupname>.*?) >");
        var matches = reg.Match(@"<meta itemprop= rating  content= 4.7 >");
        var value = matches.Groups["groupname"].Value;
        //maybe you need to replace like value.Replace('.',',')
        double.TryParse(value , out searchedValue);

(?<groupname> ... )设置了一个群组。您可以使用matches.Groups["groupname"].Value

访问该值

.*?正在阅读“>”的下一场比赛。

如果您不使用“?”,它会在您的文字中搜索“>”的最后一场比赛。

祝你好运=)