我需要在HTML中获取具有以下模式的特定元素: (C#)
<td class="blah" ...........>Some text blah: page x of xx<br>
我需要获取xx的值。
上述模式中唯一不变的是:
您可以假设上述模式只有1次出现。
答案 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。