C# C IndexOf函数未按预期工作
所以,我对编码是相当陌生的,但到目前为止,我从未遇到过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字符串 我试图找到特定元素的索引,以便稍后可以获取数据,以下是我必须找到的数据两侧位置的索引: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
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=\"")