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"> TAX:</div></td>
<td class="txtnormal"><div align="right"><strong>0.00</strong></div></td>
<td colspan="2"> </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"> </td>
(...)
请注意,代码在同一页中重复(即:<td class="txtnormal"><div align="right"><strong>VALUE</strong></div></td>
),但值的标题(TAX和Total)是唯一不同的东西(实际值可能是相同的)。
我想在一个变量中存储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页面直到的值(是为了我正在做的差异)。
你知道我怎么能得到确切的值,这是:我粘贴的文本之间的子字符串?
要从页面中抓取,您有几个选项。"最好的"方法是使用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""> </td>";
if (theRegex.Match(str).Success)
{
Console.WriteLine("Found Total of " + theRegex.Match(str).Result("$1"));
}
else
{
Console.WriteLine("Not found");
}
Console.ReadLine();
}
}
}
显然,你的HTML页面可能有其他东西会使这个简单的正则表达式出错,但你明白了。