Ejemplo n.º 1
0
 public void ProcessElement(HtmlNode node, FNAIMEntry entry)
 {
     var collection = _rx.Matches(node.InnerHtml);
     _action(entry, collection);
 }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            Add(@"(\d+)\s*m²", (entry, collection) => { // surface
                if (collection.Count == 0)
                    return;
                var value = collection[0].Groups[1].Value;
                entry.Surface = value;
            });

            Add(@"([\d\s]+) €", (entry, collection) => // prix
            {
                if (collection.Count == 0)
                    return;
                var value = collection[0].Groups[1].Value.Trim();
                entry.Prix = value;
            });

            Add((entry, node) => // Titre
            {
                entry.Titre = node.SelectSingleNode("./h3/a").InnerText;
            });

            Add((entry, node) =>
            {
                entry.Description = node.SelectSingleNode("./p[@class='resume']/a").InnerText;
            });

            Add((entry, node) =>
                {
                    string hrefContent = node.SelectSingleNode("./h3/a").Attributes["href"].Value;
                    entry.Reference = hrefContent.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries)[1];
                });

            Add((entry, node) =>
            {
                string typeDeBien = node.SelectSingleNode("./h3/a").InnerHtml;
                entry.TypeDeBien = typeDeBien.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)[0];
            });

            Add(@"(\d+)\s*pièce\(s\)", (entry, collection) =>
            {
                if (collection.Count == 0)
                    return;
                var value = collection[0].Groups[1].Value;
                entry.NomDePieces = Convert.ToInt32(value);
            });
            //TODO: compléter éventuellement avec des règles de traitement

            // résultats
            var resultats = new List<FNAIMEntry>();

            // TODO: replace id_localite with info from ws: http://www.fnaim.fr/include/ajax/ajax.localite.autocomplete.php?term=<code_postal>
            var identifiantLocaliteFNAIM = "32926";
            string url = "http://www.fnaim.fr/18-louer.htm?ID_LOCALITE={0}&TYPE[]=1&TYPE[]=2&PRIX_MIN=&PRIX_MAX=&ip={1}";
            bool nextPageAvailable = true;
            int currentPage = 1;
            while (nextPageAvailable)
            {
                string pagedUrl = string.Format(url, identifiantLocaliteFNAIM, currentPage);
                HtmlWeb web = new HtmlWeb();
                HtmlAgilityPack.HtmlDocument d = web.Load(pagedUrl);

                int itemCount = 0;

                foreach(HtmlNode item in d.DocumentNode.SelectNodes("//div[@class='itemContent']"))
                {
                    itemCount++;

                    try
                    {
                        var FNAIMItem = new FNAIMEntry();

                        foreach (var action in processingActions)
                        {
                            action.ProcessElement(item, FNAIMItem);
                        }

                        resultats.Add(FNAIMItem);

                        Console.WriteLine("Item: " + FNAIMItem.Titre);
                        Console.WriteLine("\\tSurface " + FNAIMItem.Surface);
                        Console.WriteLine("\\tPrix " + FNAIMItem.Prix);
                        Console.WriteLine("\\tDescription " + FNAIMItem.Description);

                        //TODO: sauvegarder en base de données
                    }
                    catch (Exception e)
                    {
                        //TODO: Sauvegarder une erreur en base de données
                        Console.WriteLine();
                        Console.WriteLine("-------------ERROR-------------");
                        Console.WriteLine(item.InnerHtml);
                        Console.WriteLine(e);
                        throw;
                    }
                }

                nextPageAvailable = d.DocumentNode.SelectNodes("//div[@id='centre']/div[contains(@class, 'blocNavigation')]/div[contains(@class, 'prevnext')]/a[contains(@class, 'next')]") != null;// itemCount > 0;
                currentPage++;
            }

            Console.WriteLine("Résultats " + resultats.Count);
        }
Ejemplo n.º 3
0
 public void ProcessElement(HtmlNode node, FNAIMEntry entry)
 {
     try
     {
         _action(entry, node);
     }
     catch {
         Console.WriteLine("Oops");
     }
 }