public void Obradi() { if (Sadrzaj != null && !Sadrzaj.Equals(string.Empty)) { HtmlAgilityPack.HtmlDocument dok = new HtmlAgilityPack.HtmlDocument(); try { dok.LoadHtml(Sadrzaj); StringBuilder greske = new StringBuilder(); HtmlAgilityPack.HtmlNodeCollection nodeCol; // provera da li je strana pronadjena nodeCol = dok.DocumentNode.SelectNodes("//*[@id=\"frame\"]/div[2]/div/div[5]/h1"); if (nodeCol != null && nodeCol[0].InnerHtml.Trim().ToUpper().Equals("Stranica nije pronađena".ToUpper())) { automobil = null; return; } //Zaglavlje string naslov = string.Empty; try { nodeCol = dok.DocumentNode.SelectNodes("//*[@id=\"listing\"]/div[1]/h1/div[1]"); if (nodeCol != null) { naslov = nodeCol[0].InnerHtml.Trim(); } else { naslov = "Bez naslova"; } } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje naslov: " + ex.Message); } float cena = 0; try { string cenaStr = dok.DocumentNode.SelectNodes("//*[@id=\"listing\"]/div[1]/h1/div[2]")[0].InnerHtml.Trim(); if (cenaStr.ToLower().Equals("na upit")) { cena = 0; } else { cena = float.Parse(cenaStr.Substring(0, cenaStr.IndexOf(" ")).Replace(".", "")); } } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje cena: " + ex.Message); } //Opste string vozilo = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.OpsteInformacije, "vozilo"); string marka = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.OpsteInformacije, "marka"); string model = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.OpsteInformacije, "model"); int godinaProizvodnje = 0; try { godinaProizvodnje = int.Parse(DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.OpsteInformacije, "Godina proizvodnje", "0")); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Godina proizvodnje': " + ex.Message); } string karoserija = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.OpsteInformacije, "karoserija"); string gorivo = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.OpsteInformacije, "gorivo"); bool fiksnaCena = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.OpsteInformacije, "Fiksna cena").ToLower() == "da"; bool zamena = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.OpsteInformacije, "zamena").ToLower() == "da"; DateTime datumPostavljanja = DateTime.MinValue;; try { datumPostavljanja = DateTime.Parse(DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.OpsteInformacije, "Datum postavljanja", DateTime.MinValue.ToShortDateString()).TrimEnd('.')); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Datum postavljanja': " + ex.Message); } int brojOglasa = 0; try { brojOglasa = int.Parse(DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.OpsteInformacije, "Broj oglasa")); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Broj oglasa': " + ex.Message); } // Dodatne informacije int kubikaza = 0; try { kubikaza = int.Parse(DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, new string[] { "Kubikaža (cm3)", "Kubika" }, "0")); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Kubikaža': " + ex.Message); } int snagaKW = 0; int snagaKS = 0; try { snagaKW = int.Parse(DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, "Snaga", "0").Replace(".", "")) / 100; snagaKS = SnagaKWUKS(snagaKW); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Snaga': " + ex.Message); } int kilometraza = 0; try { kilometraza = int.Parse(DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, new string[] { "Kilometraža", "Kilometra" })); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Kilometraža': " + ex.Message); } string emisionaKlasa = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, "Emisiona klasa motora"); string pogon = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, "Pogon"); string menjac = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, "Menjač"); string brojVrata = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, "Broj vrata").Replace(" vrata", ""); string brojSedistaStr = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, "Broj sedišta", "0"); byte brojSedista = 0; try { if (brojSedistaStr.IndexOf(' ') > 0) { brojSedista = byte.Parse(brojSedistaStr.Remove(brojSedistaStr.IndexOf(' '))); } else if (!brojSedistaStr.Equals(string.Empty)) { brojSedista = byte.Parse(brojSedistaStr); } } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Broj sedišta': " + ex.Message); } string stranaVolana = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, "Strana volana"); string klima = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, "Klima"); string boja = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, "Boja"); DateTime registrovanDo = DateTime.MinValue; try { string regDoStr = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, "Registrovan do", DateTime.MinValue.ToShortDateString()).TrimEnd('.'); DateTime.TryParse(regDoStr, out registrovanDo); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Registrovan do': " + ex.Message); } string porekloVozila = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.DodatneInformacije, "Poreklo vozila"); // Sigurnost // Oprema // Opis string opis = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.Opis); //kontakt string kontakt = DajPodatakIzDokumenta(ref dok, PodaciOAutomobilu.Kontakt).Replace("(Pogledajte mapu)\r\n", ""); automobil = new Automobil(brojOglasa, naslov, cena, adresa, vozilo, marka, model, godinaProizvodnje, karoserija, gorivo, fiksnaCena, zamena, datumPostavljanja, kubikaza, snagaKW, snagaKS, kilometraza, emisionaKlasa, pogon, menjac, brojVrata, brojSedista, stranaVolana, klima, boja, registrovanDo, porekloVozila, opis, kontakt); if (greske.Length > 0) { string upozorenje = string.Format("Greške pri parsiranju oglasa {0}, URL: {1}\n", automobil.BrojOglasa, automobil.URL) + greske; Dnevnik.PisiSaThredomUpozorenje(upozorenje); Dnevnik.PisiSaThredomUpozorenje("Sadržaj strane: " + Sadrzaj); //EventLogger.WriteEventWarning(upozorenje); } } catch (Exception ex) { EventLogger.WriteEventError("Greška pri parsiranju strane oglasa: " + adresa, ex); } } else { throw new StranaNijeProcitanaException(); } }
public static Model.Vehicle.Automobile ParseAutomobileAd(string HtmlContent, string address) { string Sadrzaj = HtmlContent; Automobile automobile = null; if (!string.IsNullOrWhiteSpace(Sadrzaj)) { HtmlAgilityPack.HtmlDocument dok = new HtmlAgilityPack.HtmlDocument(); try { dok.LoadHtml(Sadrzaj); StringBuilder greske = new StringBuilder(); HtmlAgilityPack.HtmlNodeCollection nodeCol; // provera da li je strana pronadjena nodeCol = dok.DocumentNode.SelectNodes("/html/body/div[2]/div[1]/p[1]"); if (nodeCol != null && nodeCol[0].InnerHtml.Trim().ToUpper().Equals("404".ToUpper())) { return(automobile); } #region Zaglavlje string naslov = string.Empty; try { nodeCol = dok.DocumentNode.SelectNodes("id('main_content')/div[8]/h1"); if (nodeCol != null) { naslov = nodeCol[0].InnerHtml.Trim(); } else { naslov = "Bez naslova"; } } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje naslov: " + ex.Message); } float cena = 0; try { string cenaStr = dok.DocumentNode.SelectNodes("id('main_content')/div[9]/div[1]/div[1]/span")[0].InnerHtml.Trim(); if (cenaStr.ToLower().Equals("na upit") || cenaStr.ToLower().Equals("po dogovoru")) { cena = 0; } else { cena = float.Parse(cenaStr.Substring(0, cenaStr.IndexOf(" ")).Replace(".", "")); } } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje cena: " + ex.Message); } #endregion Zaglavlje #region Opste var nodeOpste = dok.DocumentNode.Descendants("div").Where(div => div.Attributes.Contains("class") && div.Attributes["class"].Value.Equals("basic-info")).First(); int listItemIndex = 1; string vozilo = string.Empty; try { vozilo = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim(); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje vozilo: " + ex.Message); } string marka = string.Empty; try { marka = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim(); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje marka: " + ex.Message); } string model = string.Empty; try { model = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim(); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje model: " + ex.Message); } int godinaProizvodnje = 0; try { godinaProizvodnje = int.Parse(nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim().Substring(0, 4)); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Godina proizvodnje': " + ex.Message); } int kilometraza = 0; try { string kmStr = nodeOpste.SelectNodes("ul/li[" + listItemIndex + "]")[0].InnerHtml.Trim(); kmStr = kmStr.Replace(" km", string.Empty).Replace(".", string.Empty).Trim(); if (kmStr.All(c => char.IsDigit(c))) { kilometraza = int.Parse(kmStr); listItemIndex++; } } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Kilometraža': " + ex.Message); } string karoserija = string.Empty; try { karoserija = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim(); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje karoserija: " + ex.Message); } string gorivo = string.Empty; try { gorivo = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim(); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje gorivo: " + ex.Message); } int kubikaza = 0; try { string kubikazaStr = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim().Replace(" cm3", string.Empty); if (kubikazaStr.Contains("Atestiran do:")) { kubikazaStr = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim().Replace(" cm3", string.Empty); } kubikaza = int.Parse(kubikazaStr); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje kubikaža: " + ex.Message); } int snagaKW = 0; int snagaKS = 0; try { string snaga = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim().Replace(" (kW/KS)", string.Empty); snagaKW = int.Parse(snaga.Remove(snaga.IndexOf('/'))); snagaKS = int.Parse(snaga.Remove(0, snaga.IndexOf('/') + 1));; } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Snaga': " + ex.Message); } bool fiksnaCena = false; try { string fiksnaCenaStr = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim(); fiksnaCena = fiksnaCenaStr.ToLower() != "Cena nije fiksna".ToLower(); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje fiksnaCena: " + ex.Message); } bool zamena = false; try { string zamenaStr = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim(); zamena = zamenaStr.ToLower() != "Zamena: NE".ToLower(); } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje fiksnaCena: " + ex.Message); } DateTime datumPostavljanja = DateTime.MinValue; try { var datumPostavljanjaNode = nodeOpste.SelectNodes("ul/li").Where(li => li.ChildNodes?[0].InnerText.Trim().ToLower() == "postavljeno:").FirstOrDefault(); if (datumPostavljanjaNode != null) { string datumPostavljanjaStr = datumPostavljanjaNode.ChildNodes[1].Attributes["datetime"].Value.Trim(); datumPostavljanja = DateTime.SpecifyKind(DateTime.Parse(datumPostavljanjaStr), DateTimeKind.Utc); } } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Datum postavljanja': " + ex.Message); } int brojOglasa = 0; listItemIndex += 2; try { var brojOglasaNode = nodeOpste.SelectNodes("ul/li").Where(li => (bool)li.ChildNodes?[0].InnerText.Trim().ToLower().Contains("broj oglasa:")).FirstOrDefault(); if (brojOglasaNode != null) { brojOglasa = int.Parse(nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim().Replace("Broj oglasa: ", string.Empty)); } } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Broj oglasa': " + ex.Message); } #endregion Opste #region Dodatne informacije var nodeDodatno = dok.DocumentNode.Descendants("div").Where(div => div.Attributes.Contains("class") && div.Attributes["class"].Value.Equals("detailed-info")).First(); string emisionaKlasa = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Emisiona klasa motora", greske); string pogon = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Pogon", greske); string menjac = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Menjač", greske); string brojVrata = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Broj vrata", greske).Replace(" vrata", string.Empty); string brojSedistaStr = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Broj sedišta", greske).Replace(" sedišta", string.Empty); byte brojSedista = 0; byte.TryParse(brojSedistaStr, out brojSedista); string stranaVolana = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Strana volana", greske); string klima = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Klima", greske); string bojaKaroserije = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Boja", greske); string materijalEnterijera = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Materijal enterijera", greske); string bojaEnterijera = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Boja enterijera", greske); string registrovanDoStr = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Registrovan do", greske); DateTime registrovanDo = DateTime.MinValue; if (!registrovanDoStr.Equals("Nije registrovan")) { registrovanDoStr = "01." + registrovanDoStr.Remove(registrovanDoStr.Length - 1);; DateTime.TryParse(registrovanDoStr, out registrovanDo); } string porekloVozila = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Poreklo vozila", greske); string vlastnistvo = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Vlasništvo", greske); string ostecenje = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Oštećenje", greske); #endregion Dodatne informacije #region Sigurnost #endregion Sigurnost #region Oprema #endregion Oprema #region Opis var x = dok.DocumentNode.Descendants("div").Where(div => div.Attributes.Contains("class") && div.Attributes["class"].Value.Equals("description")); var nodeOpis = dok.DocumentNode.Descendants("div").Where(div => div.Attributes.Contains("class") && div.Attributes["class"].Value.Equals("description")).FirstOrDefault(); string opis = string.Empty; if (nodeOpis != null) { try { foreach (var element in nodeOpis.ChildNodes) { if (element.NodeType == HtmlAgilityPack.HtmlNodeType.Text) { opis += element.InnerHtml.Trim(); } else if (element.NodeType == HtmlAgilityPack.HtmlNodeType.Element && element.Name == "br") { opis += Environment.NewLine; } } opis = opis.Trim(); opis = string.Empty; } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Opis': " + ex.Message); } } #endregion Opis #region Kontakt var nodeKontakt = dok.DocumentNode.Descendants("div").Where(div => div.Attributes.Contains("class") && div.Attributes["class"].Value.Equals("advertiser-info")).First(); string kontakt = string.Empty; try { foreach (var element in nodeKontakt.ChildNodes.Where(node => node.NodeType == HtmlAgilityPack.HtmlNodeType.Text)) { kontakt += element.InnerHtml.Trim(); } if (kontakt.Length > 2000) { kontakt.Remove(2000); } kontakt = string.Empty; } catch (Exception ex) { greske.AppendLine("Nisam mogao da pročitam polje 'Kontakt': " + ex.Message); } #endregion Kontakt automobile = new Automobile(brojOglasa, naslov, cena, address, vozilo, marka, model, godinaProizvodnje, karoserija, gorivo, fiksnaCena, zamena, datumPostavljanja, kubikaza, snagaKW, snagaKS, kilometraza, emisionaKlasa, pogon, menjac, brojVrata, brojSedista, stranaVolana, klima, bojaKaroserije, registrovanDo, porekloVozila, opis, kontakt); if (greske.Length > 0) { string upozorenje = string.Format("Greške pri parsiranju oglasa {0}, URL: {1}\nGreške: {2}", automobile.BrojOglasa, automobile.URL, greske); Dnevnik.PisiSaThredomUpozorenje(upozorenje); } } catch (Exception ex) { Dnevnik.PisiSaThredomGreska("Ne mogu da parsiram html sa adrese: " + address, ex); } } else { throw new StranaNijeProcitanaException(); } return(automobile); }