所以,我对编码很新,但到目前为止我从未遇到过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“string
\ 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
我正在尝试找到特定元素的索引,以便我可以在以后获取数据,这是我必须找到我想要的数据两侧的位置索引:
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()会更直接。 即使在我尝试添加正斜杠之前,我得到的索引值也是完全错误的。我会摆脱那些。
答案 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是要走的路!