正则表达式在HTML中获取特定TD内部的值

时间:2009-12-09 20:55:45

标签: c# regex

我需要在HTML中获取具有以下模式的特定元素: (C#)

<td class="blah" ...........>Some text blah: page x of xx<br>

我需要获取xx的值。

上述模式中唯一不变的是:

  1. 是一个TD元素
  2. 它中有class =“blah”
  3. 它具有文本模式“:xx的页面x
  4. 您可以假设上述模式只有1次出现。

4 个答案:

答案 0 :(得分:7)

Please don't use regexes to parse HTML!

抓住HTML agility pack的副本,你的生活将变得更加简单,而且你的应用程序也不那么脆弱了。

答案 1 :(得分:4)

使用正则表达式不是正确的方法。正如其他人指出的那样,使用HTML解析器。如果您有HTML Agility Pack,则可以执行此操作:

using System;
using System.Linq;
using System.Text.RegularExpressions;
using HtmlAgilityPack;

class Program
{
    static void Main(string[] args)
    {
        string html = @"<html><body><td class=""blah"" ...........>Some text blah: page 13 of 99<br> more stuff</td></body></html>";
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(html);
        var nodes = doc.DocumentNode.SelectNodes("//td[@class='blah']");
        if (nodes != null)
        {
            var td = nodes.FirstOrDefault();
            if (td != null)
            {
                Match match = Regex.Match(td.InnerText, @"page \d+ of (\d+)");
                if (match.Success)
                {
                    Console.WriteLine(match.Groups[1].Value);
                }
            }
        }
    }
}

输出:

99

但是,只要您接受它不是一个完美的解决方案,就可以使用正则表达式完成。它很脆弱,很容易被欺骗,但现在是:

class Program
{
    static void Main(string[] args)
    {
        string s = @"stuff <td class=""blah"" ...........>Some text blah: page 13 of 99<br> more stuff";
        Match match = Regex.Match(s, @"<td[^>]*\sclass=""blah""[^>]*>[^<]*page \d+ of (\d+)<br>");

        if (match.Success)
        {
            Console.WriteLine(match.Groups[1].Value);
        }
    }
}

输出:

99

请确保没有人看到你这样做。

答案 2 :(得分:0)

是HTML任意吗?它可以有CDATA块,注释,外部字符实体吗?

如果上述情况属实,那么您应该为此目的忘记正则表达式,并使用HTML Agility Pack之类的东西将其正确解析为DOM,然后使用它。

答案 3 :(得分:0)

使用解析器从您关注的特定TD获取内容,然后使用\d of (\d{2})$行的正则表达式,该值应在第一次捕获时获得xx的值基。

我特别想要编写一个能处理这个问题的HTML部分的正则表达式;另见the <center> cannot hold