2013-08-06 2 views
0

Итак, я пытаюсь извлечь все ссылки с главной страницы google с помощью регулярных выражений.регулярное выражение, возвращающее ничего

Но я столкнулся с непонятной проблемой. Когда я отправляю запрос на главную страницу google и пытаюсь извлечь все ссылки со страницы, я обычно получаю один результат, а отдых - мусор. Однако, когда я вручную просматриваю источник страницы и извлекаю некоторую ссылку для тестирования против шаблона, он работает.

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

Мой рисунок

string pattern = @"=("")?(https?:\/\/)?[\w.-]+\.[\w]*([/]?[\w]*)*("")?"; 

Мой код дисплей

Match match = Regex.Match(source, pattern); 
     if (match.Success) 
     { 
      foreach (var res in match.Groups) 
      { 
       Console.WriteLine(res); 
      } 
      Console.ReadKey(); 
     } 
+0

Нам нужно содержимое 'source' ... –

+0

Поместите контрольную точку в свой код и извлеките любые данные, прикрепленные к' source', Посмотрите, что именно Google показывает вашу программу. – Logarr

+0

хорошо, что это будет весь источник главной страницы google, не уверен, что это подходит для сообщения. –

ответ

3

Я думаю, что проблема в том, что вы только получаете один матч. Вам нужно позвонить Matches или запустить цикл:

Matches ms = Regex.Matches(source, pattern); 
foreach (var m in ms) 
{ 
    Console.WriteLine(m.Value); 
} 

или ...

Match m = Regex.Match(source, pattern); 
while (m.Success) 
{ 
    Console.WriteLine(m.Value); 
    m = m.NextMatch(); 
} 

Заметьте, что вы не должны вообще стараюсь разобрать HTML с использованием регулярных выражений. Там царит безумие. Но если вам все равно, что некоторые из «ссылок», которые вы забираете, на самом деле не являются ссылками (то есть они могут быть текстом, а не hrefs), то использование этого регулярного выражения не является проблемой.

Кстати, есть статья MSDN, Example: Scanning for HREFs, которая может показаться вам полезной.

+0

Да, я знаю регулярное выражение для разбора HTMl нехорошо. Но я использую их для обучения. –

3

Don't try and parse HTML with regex. Вместо этого используйте парсер HTML, например Html Agility Pack. Это становится все href ссылки с данного веб-страницы (от их example page)

HtmlWeb hw = new HtmlWeb(); 
HtmlDocument doc = hw.Load(myURL); 
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href]")) 
{ 
} 
+0

Я изучаю регулярное выражение и, как таковой, не хочу использовать библиотеку –

+0

Достаточно справедливо, но просто нужно быть осторожным, если вы думаете об их использовании для разбора HTML/XML :) – keyboardP

-1

Хорошо, думаю, я понял, что проблема. Regex.Match возвращает только один ответ, замените его на Regex.Matches, чтобы вернуть целую кучу ссылок

Смежные вопросы