3

我试图在 html 的某些文本之间获取一个值,到目前为止还没有成功,我不能使用 html agility pack,因为它提供的数据只存在于 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 标记,并且在该标记中我希望获取始终可变的数据。

4

5 回答 5

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 运行,发现它返回了错误的结果。

这并不表明答案不正确,因为它与您发布的代码段一起正常工作。

meta因此,通过大胆猜测并假设您的真实 html中还有其他标签,其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();
于 2012-04-10T07:17:41.233 回答
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);

我希望这会有所帮助

于 2012-04-10T07:16:02.783 回答
1

这里

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

你用空格替换双引号。因此,您的示例字符串现在如下所示:

<meta itemprop= rating  content= 4.7 > 

但是,您的正则表达式匹配没有这些额外空格的文本。此外,您的正则表达式在关闭之前需要一个反斜杠>,这在示例中不存在。

于 2012-04-10T07:06:17.530 回答
1

您的正则表达式应该类似于@"\<meta.+?content\=\"(.+)\"\>". 虽然用正则表达式解析 HTLM 是一件坏事。

于 2012-04-10T07:08:16.157 回答
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

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

如果您不使用“ ?”,它将>在您的文本中搜索“”的最后一个匹配项。

祝你好运=)

于 2012-04-10T07:28:00.450 回答