我试图提取特定的字符串,但我唯一能得到的是数字为什么?

时间:2014-06-17 12:20:20

标签: c# .net winforms

这是代码:

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">&nbsp;&nbsp;<FONT CLASS='text16b'>43.יהי זכרו ברוך, שימליץ עלינו מלמעלה.&nbsp;&nbsp;</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>

从这个街区我应该得到一些东西:

  1. 本案例中的数字#19并将其添加到列表

  2. 本案例中的文字:שנתיים?并将其添加到列表

  3. 本案例中的日期:16.06.14并添加到列表

  4. 在这种情况下的时间:18:30以及列表

  5. 然后在下一个循环迭代中,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后会发生这种情况。

1 个答案:

答案 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);
    }