- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
open System.Net
open System.Text.RegularExpressions
open System.Text
open System
type userInfo = 
    { User : string;
      Rating : double;}
let  mutable Users  = []
(* Заполняем списки юзверей *)
let getUsersInfo s = 
    let mutable  m = Regex.Match(s, @">(?<user>[^<]+)</a></td>\s+<td class=""strength"">[^<]+</td>\s+<td class=""rating""><strong>(?<rating>[^<]+)") //+ Оптимизировать регулярку. (Page 2)
    while(m.Success) do
        let info = {User = m.Groups.["user"].Value;  Rating =  m.Groups.["rating"].Value |> double}
        Users <- Users @ [info]
        m <- m.NextMatch()
    
(* скачивание страницы по индексу *)
let getSourceForUsers p = 
    let url = "http://freehabr.ru/people/good/page" + string(p)
    let wc = new WebClient();
    let s = wc.DownloadString(url);
    printfn "Разобрана %i страница" p
    getUsersInfo s
(* получить индекс последней страницы *)    
let getLastPage =  
    let wc = new WebClient()
    wc.Encoding <- Encoding.UTF8
    let s = wc.DownloadString "http://freehabr.ru/people/"
    Regex.Match(s,@"(?<=e)\d+(?=/"">п)").Value |> int
let lastPage = getLastPage
let printList a =
    a |> List.iter (fun x -> printfn "%s рейтинг - %.2f" x.User x.Rating)
    Console.ReadKey() |> ignore
 
[<EntryPoint>]
let main(args:string[]) =
  printfn "Парсер юзерей с положительным (или нулевым) рейтингом"
  printfn "%i -- Количество страниц" lastPage
  printfn "scan --XX - __ Cбор списка пользователей от первой страницы до XX"
  printfn "scan --YY --XX __ Сбор списка пользователей от YY страницы до XX. \nXX не может быть больше, чем максимальное количество страниц в списках юзеров с положительной кармой"
  let userInput = Console.ReadLine();
  match userInput with
  | _ when userInput.StartsWith "scan --" -> let a = Regex.Split(userInput,"--")
                                             let dig = a.[1] |> int
                                             if a.Length = 2 then  // для первого варианта                                               
                                                [1 .. dig] 
                                                |> List.iter getSourceForUsers
                                             else // для второго
                                                [ dig .. a.[2] |> int ] 
                                                |> List.iter getSourceForUsers
                                             printfn "~~~\nЮзеры посчитаны"
                                                
                                          
  | _ -> printfn "Завершение приложения"
         exit(1) 
  
  printfn "~~~~\nОбработка списка\n~~~~"
  printfn "usersGreaterRate --XX __ Показать пользователей,\nу которых рейтинг больше или равен XX"
  printfn "usersLessRate --XX __ Показать пользователей,\nу которых рейтинг меньше или равен XX"
  printfn "usersWithNamesBegins --String __ Показать пользователей,\nу которых имя начинается со строки String"
  let usersOper = Console.ReadLine()
  let param = Regex.Split(usersOper," --").[1] 
  match usersOper with
  | _ when usersOper.StartsWith "usersGreaterRate --" -> Users 
                                                         |> List.filter (fun x -> x.Rating > (param |> double))
                                                         |> printList
  | _ when usersOper.StartsWith "usersLessRate --" -> Users
                                                      |> List.filter (fun x -> x.Rating < (param |> double))
                                                      |> printList
  | _ when usersOper.StartsWith "usersWithNamesBegins --" -> Users
                                                                |> List.filter (fun x -> x.User.StartsWith param)
                                                                |> printList
  | _ -> printfn "Завершение приложения"
         exit(1) 
  0
                                 
        
Где говнокод? Кроме магических строк ничего страшного нет.
open System.Net
open System.Text.RegularExpressions
open System.Text
open System
это все же .NET
чо уж мелочиться
Где говно? *Выполняет призыв КЭП'а. Трах-тибидохХх-тибисдох*
я его 7 лет назад юзал
Буквой.