2013-08-09 2 views
0

Я использую следующий код для поиска данных на веб-странице и возврата данных в da datagridview.Случайная ошибка в Regexp

Когда я использую его с веб-страницы, которая имеет много строк, как 100, некоторое время он будет возвращать багги линию так: CaucaiaCE

и должен быть только Каукая

Почему это происходит только в 2 линиях из 100?

это HTML I`m поиска http://pastie.org/8220836

{ 
    int i = 0; 
    Match matchLogradouro = Regex.Match(pagina, "<td width=\"268\" style=\"padding: 2px\">(.*)</td>"); 
    Match matchBairroCidade = Regex.Match(pagina, "<td width=\"140\" style=\"padding: 2px\">(.*)</td>"); 
    Match matchEstado = Regex.Match(pagina, "<td width=\"25\" style=\"padding: 2px\">([A-Z]{2})</td>"); 
    Match matchCep = Regex.Match(pagina, "<td width=\"65\" style=\"padding: 2px\">(.*)</td>"); 
    int z = Regex.Matches(pagina, "detalharCep").Count; 
    while (z > i -1) 
    {  
     dataGridView1.Rows.Add(matchLogradouro.Groups[1].Value); 
     matchLogradouro = matchLogradouro.NextMatch(); 
     dataGridView1.Rows[i].Cells[1].Value = matchBairroCidade.Groups[1].Value; 
     matchBairroCidade = matchBairroCidade.NextMatch(); 
     dataGridView1.Rows[i].Cells[2].Value = matchBairroCidade.Groups[1].Value; 
     matchBairroCidade = matchBairroCidade.NextMatch(); 
     dataGridView1.Rows[i].Cells[3].Value = matchEstado.Groups[1].Value; 
     matchEstado = matchEstado.NextMatch(); 

     dataGridView1.Rows[i].Cells[4].Value = matchCep.Groups[1].Value; 
     matchCep = matchCep.NextMatch(); 
     i++; 
    } 
} 
+0

Я вижу много жадных операторов ... попробуйте использовать '(. *?)' Вместо этого в каждом из ваших регулярных выражений. – Jerry

+11

[Не использовать регулярное выражение для разбора HTML!] (Http://stackoverflow.com/a/1732454/1336590) – Corak

+1

Черт @ Корак, я как раз собирался написать то же самое!^_^В этом случае, чтобы суммировать ... Вы пытались использовать синтаксический анализатор XML вместо этого? : D – Shaamaan

ответ

7

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

public class Foo // I believe it should be something like Address 
{ 
    public string Logradouro { get; set; } 
    public string BairroCidade1 { get; set; } 
    public string BairroCidade2 { get; set; } 
    public string Estado { get; set; } // this should be State 
    public string Cep { get; set; } 
} 

И использовать HtmlAgilityPack разобрать ваш HTML документ

HtmlDocument doc = new HtmlDocument(); 
doc.Load(html_file_name); // or doc.LoadHtml(html_string) 

var foos = from row in doc.DocumentNode.SelectNodes("//tr[td]") 
      let cells = row.SelectNodes("td").Select(td => td.InnerText).ToArray() 
      where cells.Length > 4 
      select new Foo { 
       Logradouro = cells[0], 
       BairroCidade1 = cells[1], 
       BairroCidade2 = cells[2], 
       Estado = cells[3], 
       Cep = cells[4] 
      }; 
Смежные вопросы