Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // подключаем FSharp.Data
- #r "/home/maria/Dropbox/prog/functional/packages/FSharp.Data/lib/net40/FSharp.Data.dll"
- open FSharp.Data
- open System
- open System.IO
- open System.Net
- open System.Text
- open System.Collections.Specialized
- // почтовый адрес
- let email = "nosareva.mv@phystech.edu"
- let explode (s : string) = [ for i in s -> i]
- let (^) l r = sprintf "%s%s" l r
- let dict = Map<string, string list>
- let editPhoneNumber str=
- let rec editPhoneNumbers acc = function
- | [] -> List.rev acc
- // Нормализую номера (убираю все лишние символы)
- | (x:char)::t when Char.IsDigit(x) -> editPhoneNumbers (x::acc) t
- | (x:char)::t -> editPhoneNumbers acc t
- let phoneChars = editPhoneNumbers [] (explode str)
- List.fold (fun acc (x:char) -> acc^(x.ToString())) "" phoneChars
- let rec editList acc = function
- | [] -> acc
- | (x:string list)::t -> let name = (List.item 1 x);
- let innerPhones = Array.map editPhoneNumber ((List.item 3 x).Split('\n')) |> Array.toList;
- let mobilePhones = Array.map editPhoneNumber (((List.item 4 x).TrimStart('+')).Split('+')) |> Array.toList;
- let person = if (name = "") then List.item 0 x else name;
- editList ((person, List.append innerPhones mobilePhones)::acc) t
- let getPersonsList () =
- let phones = HtmlDocument.Load("https://mipt.ru/about/general/contacts/phones.php")
- let blocks = phones.Descendants "tr"
- // При создании blocks в него помещаются как блоки с несколькими людьми, так и каждый человек отдельно, у них отсутствует тег 'colgroup'
- let persons = Seq.fold (fun (acc:HtmlNode list) (x:HtmlNode) -> if (Seq.isEmpty (x.Descendants "colgroup")) then x::acc else acc) [] blocks
- let personsWithoutTrash = List.map (fun (x:HtmlNode) -> List.map (fun (y:HtmlNode) -> y.InnerText()) (x.Elements())) persons
- editList [] personsWithoutTrash
- getPersonsList ()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement