C#:使用IndexOf和LastIndexOf从HTML代码中获取精确的子字符串

时间:2011-09-27 15:56:18

标签: c# substring

我在C#中使用GetResponseStream()检索了一个HTML页面。我需要一个来自该页面的精确值(int),每次运行程序时都会有所不同。然而,HTML代码的结构是相同的,特别是:

 (...) 
 <td colspan="2" class="txtnormal"><div align="right">&nbsp;TAX:</div></td>
 <td class="txtnormal"><div align="right"><strong>0.00</strong></div></td>
 <td colspan="2">&nbsp;</td> 
 (...) 

 (...) 
     <td colspan="2"><div align="right" class="txtnormal">Total:</div></td>
 <td class="txtnormal"><div align="right"><strong>10.00</strong></div></td>
 <td colspan="2">&nbsp;</td>
 (...)

请注意,代码在同一页面中重复(即:<td class="txtnormal"><div align="right"><strong>VALUE</strong></div></td>),但值的标题( TAX 总计)是唯一不同的东西(实际值可能相同)。

我想在变量中存储总计值,这是:10.0 在这种情况下

我试过了:

int first = responseFromServer.IndexOf("<td class= \"txtnormal\"><div align=\"right\"><strong>") + "<td class=\"txtnormal\"><div align=\"right\"><strong>".Length;
int last = responseFromServer.LastIndexOf("</strong></div></td>");
string value = responseFromServer.Substring(first, last - first);

但是我得到了不好的结果,值 全部 HTML页面直到值(用于差异我)我在做。)

你知道我怎么能得到确切的值,这是:我粘贴的文字之间的子字符串?

非常感谢。

2 个答案:

答案 0 :(得分:1)

要从页面中抓取,您有几个选项。 “最好的”是使用DOM来查找有问题的节点并提取它的值。如果由于某种原因无法使用DOM,则可以转到正则表达式并以此方式提取值。

在许多情况下,您的方法“没问题”,只要您可以确定网站所有者永远不会在下游任何地方设置另一个"</strong></div></td>"实例。这是一个冒险的假设。

你对int字符串有什么价值?这将告诉您特定模式是否正常工作。我会认为HTML DOM仍然存在,因为它是一种更准确的遍历节点的方法。

答案 1 :(得分:0)

我认为Regex是你的朋友:

using System;
using System.Text.RegularExpressions;

namespace SimpleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Regex theRegex = new Regex(@">Total:<.+?<strong>(.+?)</strong>");
            string str = @"<td colspan=""2""><div align=""right"" class=""txtnormal"">Total:</div></td>" +
                     @"<td class=""txtnormal""><div align=""right""><strong>10.00</strong></div></td>" +
                     @"<td colspan=""2"">&nbsp;</td>";
            if (theRegex.Match(str).Success)
            {
                Console.WriteLine("Found Total of " + theRegex.Match(str).Result("$1"));
            }
            else
            {
                Console.WriteLine("Not found");
            }
            Console.ReadLine();
        }
    }
}

显然,你的HTML页面可能还有其他东西可以使这个简单的正则表达式更快,但你明白了。