2014-06-17 56 views
0

這是代碼:我想提取特定的字符串,但唯一不能得到的是數字爲什麼?

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(點)和inclusing該類別中的數ASE 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); 
      } 

     } 

但名單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. 在這種情況下,日期:14年6月16日,並添加到列表

  4. 的時間在這種情況下:18:30,也到列表

然後在下一個循環中重複who內容變量中的下一個塊。 等等,直到完成時才結束它,應該返回到鏈接方法下載下一個內容並再次循環它......等等方法鏈接中的所有鏈接。

而我更願意在使用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

contents.Substring的*調用(...)*應爲您提供包括 「43」 的字符串。您的問題中的* GetResponsers *方法與您的實際代碼中的方法不同(因此沒有說明問題),或者傳遞給* GetResponsers *的* contents *字符串不包含「43」。... – elgonzo

+0

我現在知道這個問題。變量cont下載鏈接cont = contents.DownloadString(FilteredLinks [i]);然後在GetResponsers即時只獲得第一個響應,然後它只是繼續到下一個鏈接,並進行另一次下載,每次只獲得第一個響應。 FilteredLinks包含50個鏈接。 – user3747465

+0

我需要的是以某種方式使循環可能與while,並在GetResponsers方法中提取所有的響應,只有當完成後,讓他們所有人contine和下載下一個鏈接。如何在GetResponsers方法內使用循環? – user3747465

回答

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); 
    } 
相關問題