Advertisement
Guest User

Untitled

a guest
May 21st, 2017
516
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.09 KB | None | 0 0
  1. // подключаем FSharp.Data
  2. #r "/home/maria/Dropbox/prog/functional/packages/FSharp.Data/lib/net40/FSharp.Data.dll"
  3. open FSharp.Data
  4. open System
  5. open System.IO
  6. open System.Net
  7. open System.Text
  8. open System.Collections.Specialized
  9.  
  10. // почтовый адрес
  11. let email = "nosareva.mv@phystech.edu"
  12. let explode (s : string) = [ for i in s -> i]
  13. let (^) l r = sprintf "%s%s" l r
  14. let dict = Map<string, string list>
  15.  
  16. let editPhoneNumber str=
  17.   let rec editPhoneNumbers acc = function
  18.     | [] -> List.rev acc
  19.     // Нормализую номера (убираю все лишние символы)
  20.     | (x:char)::t when Char.IsDigit(x) -> editPhoneNumbers (x::acc) t
  21.     | (x:char)::t -> editPhoneNumbers acc t
  22.   let phoneChars = editPhoneNumbers [] (explode str)
  23.   List.fold (fun acc (x:char) -> acc^(x.ToString())) "" phoneChars
  24.  
  25. let rec editList acc = function
  26.   | [] -> acc
  27.   | (x:string list)::t -> let name = (List.item 1 x);
  28.                           let innerPhones = Array.map editPhoneNumber ((List.item 3 x).Split('\n')) |> Array.toList;
  29.                           let mobilePhones = Array.map editPhoneNumber (((List.item 4 x).TrimStart('+')).Split('+')) |> Array.toList;
  30.                           let person = if (name = "") then List.item 0 x else name;
  31.                          
  32.                           editList ((person, List.append innerPhones mobilePhones)::acc) t
  33. let getPersonsList () =
  34.   let phones = HtmlDocument.Load("https://mipt.ru/about/general/contacts/phones.php")
  35.   let blocks = phones.Descendants "tr"
  36.  
  37.   // При создании blocks в него помещаются как блоки с несколькими людьми, так и каждый человек отдельно, у них отсутствует тег 'colgroup'
  38.   let persons = Seq.fold (fun (acc:HtmlNode list) (x:HtmlNode) -> if (Seq.isEmpty (x.Descendants "colgroup")) then x::acc else acc) [] blocks
  39.   let personsWithoutTrash = List.map (fun (x:HtmlNode) -> List.map (fun (y:HtmlNode) -> y.InnerText()) (x.Elements())) persons
  40.   editList [] personsWithoutTrash
  41.  
  42. getPersonsList ()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement