C#IndexOf函数无法按预期工作

时间:2018-06-04 23:31:47

标签: c# html

所以,我对编码很新,但到目前为止我从未遇到过IndexOf的问题。我正在尝试搜索一个看起来像这样的html字符串:

  

“data-pid = \”6598160343 \“> \ n \ n https://minneapolis.craigslist.org/dak/fuo/d/executive-desk-3-piece-set/6598160343.html \”   class = \“result-image gallery \”   数据的IDS = \ “1:00B0B_hkRi5TEyM9Q,1:00z0z_jTtBxHxlxAZ,1:00p0p_2GU15WOHDEB,1:00909_eKQVd7O1pfE \” > \ n   $ 1500 \ n \ n \ n \ n \ n最喜欢这篇文章\ n
  \ n \ n Jun   4 \ n \ n \ n https://minneapolis.craigslist.org/dak/fuo/d/executive-desk-3-piece-set/6598160343.html \“   data-id = \“6598160343 \”class = \“result-title hdrlnk \”>行政办公桌(3   (套件)\ n \ n \ n \ n \ n   $ 1500 \ n \ n \ n \ n \ n pic \ n
  地图\ n
  \ n \ n \ n隐藏此帖子\ n
  \ n \ n \ n \ n还原\ n还原此帖子\ n
  \ n \ n \ n

\ n \ n“string

我正在尝试找到特定元素的索引,以便我可以在以后获取数据,这是我必须找到我想要的数据两侧的位置索引:

DataBookends bkEnds = new DataBookends
        {
            PIDFrom = (post.IndexOf(@"pid=\""")) + (@"pid=\""".Length),
            URLFrom = (post.IndexOf(@"<a href=\")) + (@"<a href=\".Length),
            PriceFrom = (post.IndexOf(@"result-price\"">$")) + (@"result-price\"">$".Length),
            DateFrom = (post.IndexOf(@"datetime=\""")) + (@"datetime=\""".Length),
            TitleFrom = (post.IndexOf(@"result-title hdrlnk\"">")) + (@"result-title hdrlnk\"">".Length),
            LocationFrom = (post.IndexOf(@"result-hood\""> (")) + (@"result-hood\""> (".Length)
        };
        bkEnds.PIDTo = post.IndexOf(@"\""", bkEnds.PIDFrom);
        bkEnds.URLTo = post.IndexOf(@"\", bkEnds.URLFrom);
        bkEnds.PriceTo = post.IndexOf(@"</span>", bkEnds.PriceFrom);
        bkEnds.DateTo = post.IndexOf(@"\", bkEnds.DateFrom);
        bkEnds.TitleTo = post.IndexOf(@"</a>", bkEnds.TitleTo);
        bkEnds.LocationTo = post.IndexOf(@"\", bkEnds.LocationFrom);

        return bkEnds;

但是,每当我尝试运行它时,它都找不到任何内容,或者索引值不正确。我知道我错过了一些简单的东西,但我无法理解它,我觉得自己像个白痴。是否与我没有看到的转义字符或我的字符串格式化有关? 请帮忙吗?

编辑: 我最初尝试使用HTML Agility Pack,但我无法理解如何提取我需要的数据,因此我认为使用string.substring()会更直接。 即使在我尝试添加正斜杠之前,我得到的索引值也是完全错误的。我会摆脱那些。

3 个答案:

答案 0 :(得分:1)

我会写下这个答案,但实际上是评论中的CraigW发现了你的错误。我认为它仍然可以使用一些解释,因为你错过了它。此外,其他评论是正确的,解析器可能是要走的路。我仍然认为你应该理解你所犯的错误,因为它通常很有用。

你说变量有这个字符串

  

&#34; data-pid = \&#34; 6598160343 \&#34;&gt; \ n \ n https://minneapolis.craigslist.org/dak/fuo/d/executive-desk-3-piece-set/6598160343.html \&#34; class = \&#34; result-image gallery \&#34; data-ids = \&#34; 1:00B0B_hkRi5TEyM9Q,1:00z0z_jTtBxHxlxAZ,1:00p0p_2GU15WOHDEB,1:00909_eKQVd7O1pfE \&#34;&gt; \ n $ 1500 \ n \ n \ n \ n \ n最喜欢的帖子\ n   \ n \ n 6月4日\ n \ n \ n https://minneapolis.craigslist.org/dak/fuo/d/executive-desk-3-piece-set/6598160343.html \&#34;数据-ID = \&#34; 6598160343 \&#34; class = \&#34; result-title hdrlnk \&#34;&gt; Executive Desk(3件套)\ n \ n \ n \ n   $ 1500 \ n \ n \ n \ n \ n pic \ n   地图\ n   \ n \ n \ n隐藏此帖子\ n   \ n \ n \ n \ n还原\ n还原此帖子\ n   \ n \ n \ n   \ n \ n&#34;串

似乎来自调试器。您正在搜索

post.IndexOf(@"pid=\""")

这不会找到匹配,因为它确实在寻找不在您变量中的pid=\"。您的变量实际上包含

data-pid="6598160343">
 https://minneap....

调试器将其显示为

data-pid=\"6598160343\">\n\n https://minneap

因为它总是逃脱&#39;引号(即变量中的"在观察窗口中显示为\"),类似的换行符显示为\n。如果单击放大镜图标,您将看到实际的字符串,没有转义。

希望能够清除你的困惑,如果确实如此,你现在会意识到这段代码会起作用

post.IndexOf(@"pid=""")

此外,如果您不感兴趣,请注意,如果您未在字符串前使用@,则可以转义",例如。

post.IndexOf("pid=\"")

答案 1 :(得分:0)

我认为您可以稍微更改一下代码,因为它很难调试。请参阅下面的代码并了解您的想法。您可以将方法ExtractData(以及类)复制并粘贴到您的代码中,但是您需要添加一些代码来验证patterStart,patterEnd可以从内容中找到

using System;

public static class StringFinder
{
    public static string ExtractData(this string content, string patterStart, string patternEnd)
    { 
        var indexStart = content.IndexOf(patterStart) + patterStart.Length;
        var indexEnd = content.IndexOf(patternEnd, indexStart);
        return content.Substring(indexStart,indexEnd - indexStart);
    }
}

public class Program
{
    public static void Main()
    {
        var data = @" data-pid=\""6598160343\"">\n\n https://minneapolis.craigslist.org/dak/fuo/d/executive-desk-3";

        Console.WriteLine(data.ExtractData(@"data-pid=\""", @"\"">"));
    }
}

结果6598160343

答案 2 :(得分:0)

所以我弄清楚了,我最终选择了Jeremy建议的HTML Agility Pack。我无法弄清楚我是如何使用IndexOf和Substring搜索它的确切错误(例如:它会跳过“”并继续直到不包含任何这些字符的点),但是我不会再那样尝试网络抓取了。

对于未来,HTML Agility Pack是要走的路!