这是代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using HtmlAgilityPack;
namespace ScrollLabelTest
{
class ExtractLinks
{
WebClient contents = new WebClient();
string cont;
List<string> links = new List<string>();
List<string> FilteredLinks = new List<string>();
List<string> Respones = new List<string>();
public void Links(string FileName)
{
HtmlDocument doc = new HtmlDocument();
doc.Load(FileName);
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
HtmlAttribute att = link.Attributes["href"];
if (att.Value.StartsWith("http://rotter.net/forum/scoops1"))
{
links.Add(att.Value);
}
}
for (int i = 0; i < links.Count; i++)
{
int f = links[i].IndexOf("#");
string test = links[i].Substring(0, f);
FilteredLinks.Add(test);
}
for (int i = 0; i < FilteredLinks.Count; i++)
{
contents.Encoding = System.Text.Encoding.GetEncoding(1255);
cont = contents.DownloadString(FilteredLinks[i]);
Respones.Add("Thread #1");
GetResponsers(cont);
}
}
private void GetResponsers(string contents)
{
string firstTag = "<FONT CLASS='text16b'>";
string lastTag = "&n";
int f = contents.IndexOf(firstTag);
int g = contents.IndexOf(lastTag, f);
string responser = contents.Substring(f + firstTag.Length, g - f - firstTag.Length);
}
}
}
问题出在GetResponsers的最后一个方法中: 这是文本内容中的一行,这是我想从中提取特定文本的许多行中的一行:
<font size="2" face="Arial" color="#000099"> <FONT CLASS='text16b'>43.יהי זכרו ברוך, שימליץ עלינו מלמעלה. </font><br>
我想要提取的只是这一部分:
43.יהי זכרו ברוך, שימליץ עלינו מלמעלה.
在这种情况下包括poins(点)并包含数字43 但我在变量响应器中得到的是:
אזכרה במלאת שנתיים לפטירתו של אבי מורי ז''ל הרב ישעיהו רוטר.
我如何提取它附近的数字和点/点:43。? 所以我将在响应者中得到的结果是:
43.יהי זכרו ברוך, שימליץ עלינו מלמעלה.
我如何使用GetResponsers中已有的代码?
我尝试使用循环:
private void GetResponsers(string contents)
{
while(true)
{
string firstTag = "<FONT CLASS='text16b'>";
string lastTag = "&n";
int f = contents.IndexOf(firstTag);
int g = contents.IndexOf(lastTag, f);
string responser = contents.Substring(f + firstTag.Length, g - f - firstTag.Length);
UsersRespones.Add(responser);
}
}
但List UserResponses包含超过1000个索引,并且所有索引都是相同的字符串。 它从文本中提取相同的索引。
如何使循环在标签出现的下一个位置提取每个下一个字符串?
好的,这是每次我应该在GetResponsers方法内循环中提取的文本块:
SIZE="2" FACE="Arial" color="#000099"><a href="#19"><font color=''>שנתיים?</font></a></font></td>
<td align="center" nowrap><font SIZE="1"
FACE="Arial" color="#000099">אפריאט</font></td>
<td align="center" nowrap><font SIZE="1"
FACE="Arial" color="#000099">16.06.14 <font SIZE="1"
FACE="Arial" color="red">18:30</font></td>
<td align="center" nowrap><font SIZE="1"
FACE="Arial" color="#000099">19</font></td>
</tr>
从这个街区我应该得到一些东西:
本案例中的数字#19并将其添加到列表
本案例中的文字:שנתיים?并将其添加到列表
本案例中的日期:16.06.14并添加到列表
在这种情况下的时间:18:30以及列表
然后在下一个循环迭代中,who内容变量中的下一个块。 等等,只有当它完成时才会结束它应该返回到Links方法下载下一个内容并再次循环...等等方法链接中的所有链接。
我更喜欢在使用IndexOf和Substring的GetResponsers中使用我的代码。
修改
试过这个:
private void GetResponsers(string contents)
{
int startPos = 0;
while(true)
{
string firstTag = "<FONT CLASS='text16b'>";
string lastTag = "&n";
int f = contents.IndexOf(firstTag, startPos);
int g = contents.IndexOf(lastTag, f);
startPos = g + lastTag.Length;
string responser = contents.Substring(f + firstTag.Length, g - f - firstTag.Length);
UsersRespones.Add(responser);
}
}
Bt在线上获得例外:
int g = contents.IndexOf(lastTag, f);
指数超出范围。必须是非负数且小于集合的大小
添加startPos后会发生这种情况。
答案 0 :(得分:0)
试试这个算法:
string contents = "<tr><font SIZE=\"2\" FACE=\"Arial\" color=\"#000099\">" +
"<a href=\"#19\"><font color=''>שנתיים?</font></a></font></td>" +
"<td align=\"center\" nowrap>" +
"<font SIZE=\"1\" FACE=\"Arial\" color=\"#000099\">אפריאט</font></td>" +
"<td align=\"center\" nowrap>" +
"<font SIZE=\"1\" FACE=\"Arial\" color=\"#000099\">16.06.14 " +
"<font SIZE=\"1\" FACE=\"Arial\" color=\"red\">18:30</font></td>" +
"<td align=\"center\" nowrap>" +
"<font SIZE=\"1\" FACE=\"Arial\" color=\"#000099\">19</font></td></tr>";
List<string> myList = new List<string>();
string hrefToken = "href=\"";
int hrefOffset = hrefToken.Length;
int tableRowIndex = contents.IndexOf("<tr>");
int tableRowEndIndex = -1;
int rowFontIndex = -1;
int anchorIndex = -1;
int anchorHrefIndex = -1;
int anchorHrefNumIndex = -1;
string anchorHrefNumber = "";
int fontIndex = -1;
int fontAfterTagIndex = -1;
int fontTerminateIndex = -1;
string fontItem = "";
string fontItem1 = "";
string fontItem2 = "";
string fontItem3 = "";
string fontItem4 = "";
string fontItem5 = "";
while(tableRowIndex > -1)
{
rowFontIndex = contents.IndexOf("<font SIZE=\"2\" FACE=\"Arial\" color=\"#000099\">", tableRowIndex);
anchorIndex = contents.IndexOf("<a", rowFontIndex);
anchorHrefIndex = contents.IndexOf(hrefToken, anchorIndex);
anchorHrefNumIndex = anchorHrefIndex + hrefOffset;
anchorHrefNumber = contents.Substring(anchorHrefNumIndex, contents.IndexOf("\"", anchorHrefNumIndex) - anchorHrefNumIndex);
fontTerminateIndex = anchorHrefIndex;
for(int i = 0; i < 5; i++)
{
fontIndex = (i == 3) ? fontTerminateIndex : contents.IndexOf("<font", fontTerminateIndex);
fontAfterTagIndex = contents.IndexOf(">", fontIndex) + 1;
fontTerminateIndex = (i == 2) ? contents.IndexOf("<font", fontAfterTagIndex) : contents.IndexOf("</font>", fontAfterTagIndex);
fontItem = contents.Substring(fontAfterTagIndex, fontTerminateIndex - fontAfterTagIndex);
switch (i)
{
case 0:
fontItem1 = fontItem;
break;
case 1:
fontItem2 = fontItem;
break;
case 2:
fontItem3 = fontItem;
fontTerminateIndex = contents.IndexOf(">", fontTerminateIndex);
break;
case 3:
fontItem4 = fontItem;
break;
case 4:
fontItem5 = fontItem;
break;
}
}
myList.Add(anchorHrefNumber);
myList.Add(fontItem1);
myList.Add(fontItem2);
myList.Add(fontItem3);
myList.Add(fontItem4);
myList.Add(fontItem5);
tableRowEndIndex = contents.IndexOf("</tr>", tableRowIndex);
tableRowIndex = contents.IndexOf("<tr>", tableRowEndIndex);
}