【问题标题】:C#: Get exact substring from HTML code using IndexOf and LastIndexOfC#:使用 IndexOf 和 LastIndexOf 从 HTML 代码中获取准确的子字符串
【发布时间】:2011-09-27 15:56:18
【问题描述】:

我在 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>
 (...)

请注意,代码在同一页面中重复(即:&lt;td class="txtnormal"&gt;&lt;div align="right"&gt;&lt;strong&gt;VALUE&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;),但值的标题(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);

但是我得到了不好的结果,存储在 ALLvalue 的 HTML 页面 直到 的值(是为了区别我´我在做)。

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

非常感谢。

【问题讨论】:

    标签: c# substring


    【解决方案1】:

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

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

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

    【讨论】:

    • 我得到:(... a lot of HTML code ... ) &lt;td width="9%"&gt;&lt;input type="hidden" name="nunberacc" value="000098800"&gt;&lt;/td&gt; &lt;td colspan="4" class="txtbold Style7"&gt;&lt;div align="center"&gt;&lt;/div&gt;&lt;/td&gt; &lt;td colspan="2"&gt;&lt;div align="right" class="txtnormal"&gt;Total:&lt;/div&gt;&lt;/td&gt; &lt;td class="txtnormal"&gt;&lt;div align="right"&gt;&lt;strong&gt;10.00
    • 这意味着 LastIndexof 不适合你。您可以使用 IndexOf 进行迭代并找到所有实例。最接近您的第一个值的那个将是要使用的那个。或者切换到 Regex 或 DOM。
    【解决方案2】:

    我认为 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 页面可能有其他内容可能会影响这个简单的正则表达式,但您明白了。

    【讨论】:

    • 你好:我试图复制这个,但所有的 HTML 响应。这是:string str = @" " + responseFromServer + " "; 但我在Match(str).Success 中变得错误。也许是因为我必须双引号所有“。你能建议我一个优雅的解决方案吗?我的意思是:不要用""替换所有"(即:string str = @" " + responseFromServer.Replace("\"", "\"\"") + " ";
    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 2012-12-30
    • 2016-06-09
    • 2020-04-07
    • 2016-06-17
    • 2015-01-11
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多