2012-05-28 3 views
1

Так что я пытаюсь захватить ссылки профиля участника из форума и отображать их в консольном приложении. То, что я хочу сделать, это захватить все ссылки с веб-страницы и распечатать их.C# получить определенную часть строки для множественных вхождений в строку

тока я получаю источник страницы, как так:

String source = WebClient.DownloadString("URL"); 

То, что я хочу сделать, это перебирать эту строку и найти все строки, как это:

<h3 class='ipsType_subtitle'> 
     <strong><a href='http://www.website.org/community/user/8416-unreal/' title='View Profile'>!Unreal</a></strong> 
</h3> 

Тогда, как только я получить, что часть, я хочу, чтобы получить URL, как так:

http://www.website.org/community/user/8416-unreal/

В настоящее время это код, который я пробовал, он работает. Но только захватывает одно из звеньев:

WebClient c = new WebClient(); 
    String members = c.DownloadString("http://www.powerbot.org/community/members/"); 
    int times = Regex.Matches(members, "<h3 class='ipsType_subtitle'>").Count; 
    Console.WriteLine(times.ToString()); 

    for (int i = 1; i < times; i++) 
    { 
     try 
     { 
      int start = members.IndexOf("<h3 class='ipsType_subtitle'>"); 
      members = members.Substring(start, 500); 
      String[] next = members.ToString().Split(new string[] { "a href='" }, StringSplitOptions.None); 
      String[] link = next[1].Split(' '); 
      Console.WriteLine(link[0].Replace("'", "")); 
     } 
     catch(Exception e) { Console.WriteLine("Failed: " + e.ToString()); } 
    } 

    Console.Read(); 

Спасибо.

+1

[Что вы пытались] (http://whathaveyoutried.com)? – Oded

+0

@Oded Добавил мой текущий код. –

+0

Один вариант (не обязательно самый эффективный) - использовать [регулярные выражения] (http://www.regular-expressions.info/dotnet.html) и извлекать URL-адрес с помощью групп захвата – mgibsonbr

ответ

1
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(members); 

var links = doc.DocumentNode 
    .Descendants("h3") 
    .Where(h => h.Attributes["class"] != null && h.Attributes["class"].Value == "ipsType_subtitle") 
    .Select(h => h.Descendants("a").First().Attributes["href"].Value) 
    .ToArray(); 
0

Наиболее правильный путь в Пазинг HTML использует HTML-парсер, как HtmlAgilityPack. Вы не можете правильно передать HTML странице другим способом.

Это понятие сбалансированное родительство. Вы не можете parse ((x)) Строка с регулярным выражением, потому что вам нужно запомнить дерево разбора , но регулярные выражения являются конструкциями без учета состояния.

Они не плохие, но просто не подходят для такого типа разбора.

Надеюсь, это поможет.

0

Ниже вы можете найти свой код, на который я вносил изменения, и теперь все должно быть в порядке. Но, конечно, вы не выбрали лучший метод для этой задачи.

WebClient c = new WebClient(); 
String members = c.DownloadString("http://www.powerbot.org/community/members/"); 
int times = Regex.Matches(members, "<h3 class='ipsType_subtitle'>").Count; 
Console.WriteLine(times.ToString()); 

var member = string.Empty;//extracted value 

for (int i = 1; i < times; i++) 
{ 
    try 
    { 
     int start = members.IndexOf("<h3 class='ipsType_subtitle'>"); 
     member = members.Substring(start, 500); 

     members = members.Remove(start, 500); 

     String[] next = member.ToString().Split(new string[] { "a href='" }, StringSplitOptions.None); 
     String[] link = next[1].Split(' '); 
     Console.WriteLine(link[0].Replace("'", "")); 
    } 
    catch(Exception e) { Console.WriteLine("Failed: " + e.ToString()); } 
} 

Console.Read(); 
Смежные вопросы