我在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 和总计)是唯一不同的东西(实际值可能相同)。
我想在变量中存储总计值,这是: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页面直到值(用于差异我)我在做。)
你知道我怎么能得到确切的值,这是:我粘贴的文字之间的子字符串?
非常感谢。
答案 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""> </td>";
if (theRegex.Match(str).Success)
{
Console.WriteLine("Found Total of " + theRegex.Match(str).Result("$1"));
}
else
{
Console.WriteLine("Not found");
}
Console.ReadLine();
}
}
}
显然,你的HTML页面可能还有其他东西可以使这个简单的正则表达式更快,但你明白了。