Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C IndexOf函数未按预期工作_C#_Html - Fatal编程技术网

C# C IndexOf函数未按预期工作

C# C IndexOf函数未按预期工作,c#,html,C#,Html,所以,我对编码是相当陌生的,但到目前为止,我从未遇到过IndexOf的问题。我正在尝试搜索一个html字符串,该字符串如下所示: 数据pid=\6598160343\>\n\nhttps://minneapolis.craigslist.org/dak/fuo/d/executive-desk-3-piece-set/6598160343.html\ class=\result图像库\ 数据ID=\1:00B0B_hkRi5TEyM9Q,1:00z0z_jTtBxHxlxAZ,1:00p0p_2

所以,我对编码是相当陌生的,但到目前为止,我从未遇到过IndexOf的问题。我正在尝试搜索一个html字符串,该字符串如下所示:

数据pid=\6598160343\>\n\nhttps://minneapolis.craigslist.org/dak/fuo/d/executive-desk-3-piece-set/6598160343.html\ class=\result图像库\ 数据ID=\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\nhttps://minneapolis.craigslist.org/dak/fuo/d/executive-desk-3-piece-set/6598160343.html\ 数据id=\6598160343\class=\result title hdrlnk\>行政台3 工件组\n\n\n\n $1500\n\n\n\n\n图片\n 映射\n \n\n\n隐藏此发布\n \n\n\n\n还原\n还原此发布\n \n\n\n

\n\n字符串

我试图找到特定元素的索引,以便稍后可以获取数据,以下是我必须找到的数据两侧位置的索引:

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会更简单。
我得到的索引值是完全错误的,甚至在我尝试添加前斜杠之前。我会把它们去掉的。

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

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

我会写下这个答案,但实际上是CraigW在评论中发现了你的错误。我想你还是需要解释一下,因为你错过了。另外,其他的评论是正确的,即解析器可能是一种方法。我仍然认为你应该理解你犯的错误,因为它通常是有用的

你说过这个变量有这个字符串

数据pid=\6598160343\>\n\n\class=\result image gallery\data id=\1:00B0B_hkRi5TEyM9Q,1:00z0z_jTtBxHxlxAZ,1:00p0p_2GU15WOHDEB,1:00909_eKQVd7O1pfE\>\n$1500\n\n\n\n\n\n\n\n最喜欢这篇文章\n \n\n 6月4日\n\n\n\data id=\6598160343\class=\result title hdrlnk\>办公桌3件套\n\n\n $1500\n\n\n\n\n图片\n 映射\n \n\n\n隐藏此发布\n \n\n\n\n还原\n还原此发布\n \n\n\n \n\n字符串

它似乎来自调试器。你在找我

post.IndexOf(@"pid=\""")
这不会找到命中,因为它实际上是在查找pid=\而不是在变量中。您的变量实际上包含

data-pid="6598160343">
 https://minneap....
调试器将其显示为

data-pid=\"6598160343\">\n\n https://minneap
因为它总是“转义”引号,即变量中的a在监视窗口中显示为\并且类似的换行符显示为\n。如果单击放大镜图标,您将看到字符串的真实状态,而不带转义符

希望这能消除你的困惑,如果是的话,你现在会意识到这段代码是可行的

post.IndexOf(@"pid=""")
另外,出于您的兴趣,请注意,如果在字符串之前不使用@,则可以转义,例如


所以我明白了,我最终还是按照杰里米的建议使用了HTML敏捷包。例如,我无法弄清楚我使用IndexOf和Substring搜索它的方式到底出了什么问题:它将跳过并继续搜索,直到一个不包含任何这些字符的点,但我不会再次尝试以这种方式进行网页抓取


对于未来,HTML敏捷包是一条必由之路

是否有可能您正在查看的字符串被转义,但您正在操作的字符串却没有转义?这不是您要问的问题,但您是否查看了HTML Agility Pack?我现在停止并埋葬此代码,改用HTML Agility Pack。我猜您从调试器中取出了示例字符串。调试器显示的那些反斜杠字符实际上不在字符串中,它们只是显示在调试器输出中,因为调试器将值显示为带引号的字符串,因此需要对其进行转义。您的实际字符串很可能是数据pid=6598160343>\n\n…您遇到了问题,然后尝试使用需要了解的库来解决它,遇到了问题,然后尝试以错误的方式解决,出现了更多问题。作为一名优秀的程序员,最重要的是能够权衡这一点,并选择在哪里花费时间。正如注释所描述的,您不应该尝试解析html 赛尔夫,它几乎每次都会咬你,它无法维护,而且很容易折断。你需要咬紧牙关,使用一个专用的解析器,你的头发会很快变白
post.IndexOf("pid=\"")