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

本文关键字:获取 字符串 代码 HTML 使用 IndexOf LastIndexOf | 更新日期: 2023-09-27 18:09:43

我有一个使用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>),但值的标题(TAXTotal)是唯一不同的东西(实际值可能是相同的)。

我想在一个变量中存储Total值,这是: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页面直到的值(是为了我正在做的差异)。

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

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

要从页面中抓取,您有几个选项。"最好的"方法是使用DOM找到有问题的节点并提取其值。如果由于某种原因不能使用DOM,则可以使用正则表达式并以这种方式拉取值。

你的方法在许多情况下是"好的",只要你能确定站点所有者永远不会在下游的任何地方设置"</strong></div></td>"的另一个实例。这是一个冒险的假设。

int字符串的值是多少?这将告诉你你的特定模式是否正常工作。我仍然会考虑HTML DOM,因为它是遍历节点的更准确的方法。

我认为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页面可能有其他东西会使这个简单的正则表达式出错,但你明白了。