public static void ExtractJewelry(List<ItemBase> items, List<Tuple<string, string>> images) { var web = new HtmlWeb(); var doc = web.Load(@"http://www.pathofexile.com/item-data/jewelry", "GET"); var breaks = doc.DocumentNode.SelectNodes("//br"); var itemTypeHeader = doc.DocumentNode.SelectNodes(@"//h1[contains(@class,'topBar') and contains(@class,'last') and contains(@class,'layoutBoxTitle')]"); foreach (var header in itemTypeHeader) { var h = header.InnerText; var table = header.SelectSingleNode("following::table[@class='itemDataTable']"); var lines = table.SelectNodes("tr[not(descendant-or-self::th)]"); for (int i = 0; i < lines.Count; i++) { var namel = lines[i].SelectNodes("td"); var image = namel[0].SelectSingleNode("img[@data-large-image]").Attributes["data-large-image"].Value; var name = namel[1].InnerText; var level = namel[2].InnerText; images.Add(Tuple.Create(name, image)); var xe = new ItemBase() { GearGroup = JewelryGroupMap[h], Class = JewelryClassMap[h], ItemType = name, Level = int.Parse(level) }; var implModnodes = new string[2][]; implModnodes[0] = namel[3].InnerHtml.Trim().Split(new[] { "<br>" }, StringSplitOptions.RemoveEmptyEntries).ToArray(); implModnodes[1] = namel[4].InnerHtml.Trim().Split(new[] { "<br>" }, StringSplitOptions.RemoveEmptyEntries).ToArray(); if (implModnodes.Length > 0) { implModnodes[0] = implModnodes[0].Select(n => n.Replace("+", "").Trim()).ToArray(); for (int j = 0; j < implModnodes[0].Length; j++) xe.ImplicitMods.Add(new Stat(implModnodes[0][j], implModnodes[1][j])); } items.Add(xe); } } }
public static void ExtractWeapons(List<ItemBase> items, List<Tuple<string, string>> images) { var web = new HtmlWeb(); var doc = web.Load(@"http://www.pathofexile.com/item-data/weapon", "GET"); var itemTypeHeader = doc.DocumentNode.SelectNodes(@"//h1[contains(@class,'topBar') and contains(@class,'last') and contains(@class,'layoutBoxTitle')]"); XElement root = new XElement("itembaselist"); foreach (var header in itemTypeHeader) { var h = header.InnerText; var table = header.SelectSingleNode("following::table[@class='itemDataTable']"); var lines = table.SelectNodes("tr[not(descendant-or-self::th)]"); for (int i = 0; i < lines.Count; i += 2) { var namel = lines[i].SelectNodes("td"); var image = namel[0].SelectSingleNode("img[@data-large-image]").Attributes["data-large-image"].Value; var name = namel[1].InnerText; images.Add(Tuple.Create(name, image)); var level = namel[2].InnerText; var damage = namel[3].InnerText; var aps = namel[4].InnerText; var dps = namel[5].InnerText; var reqStr = namel[6].InnerText; var reqDex = namel[7].InnerText; var reqInt = namel[8].InnerText; var xe = new ItemBase() { GearGroup = WeaponGroupMap[h], Class = WeaponClassMap[h], ItemType = name, Level = int.Parse(level), RequiredStr = int.Parse(reqStr), RequiredDex = int.Parse(reqDex), RequiredInt = int.Parse(reqInt), }; xe.Properties.Add(new Stat("Physical Damage", damage)); xe.Properties.Add(new Stat("Atacks Per Second", aps )); xe.Properties.Add(new Stat("Critical Strike Chance %", "5")); var implModnodes = lines[i + 1].SelectNodes("td") .Select(n => n.InnerHtml.Trim().Split(new[] { "<br>" }, StringSplitOptions.RemoveEmptyEntries)) .Where(v => v.Any(s => !string.IsNullOrEmpty(s))).ToArray(); if (implModnodes.Length > 0) { implModnodes[0] = implModnodes[0].Select(n => n.Replace("Minimum", "").Replace("Maximum", "").Trim()).Distinct().ToArray(); for (int j = 0; j < implModnodes[0].Length; j++) { xe.ImplicitMods.Add(new Stat(implModnodes[0][j], implModnodes[1][j])); } } items.Add(xe); } } }