public static ForumUserEntity FromPost(HtmlNode postNode) { var user = new ForumUserEntity { Username = WebUtility.HtmlDecode( postNode.Descendants("dt") .FirstOrDefault(node => node.GetAttributeValue("class", string.Empty).Contains("author")) .InnerHtml) }; var dateTimeNode = postNode.Descendants("dd") .FirstOrDefault(node => node.GetAttributeValue("class", string.Empty).Contains("registered")); if (dateTimeNode != null) { try { user.DateJoined = DateTime.Parse(dateTimeNode.InnerHtml); } catch (Exception) { // Parsing failed, so say they joined today. // I blame SA for any parsing failures. user.DateJoined = DateTime.UtcNow; } } HtmlNode avatarTitle = postNode.Descendants("dd") .FirstOrDefault(node => node.GetAttributeValue("class", string.Empty).Equals("title")); HtmlNode avatarImage = postNode.Descendants("dd") .FirstOrDefault(node => node.GetAttributeValue("class", string.Empty).Contains("title")) .Descendants("img") .FirstOrDefault(); if (avatarTitle != null) { user.AvatarTitle = WebUtility.HtmlDecode(avatarTitle.InnerText).WithoutNewLines().Trim(); } if (avatarImage != null) { user.AvatarLink = avatarImage.GetAttributeValue("src", string.Empty); } var userIdNode = postNode.DescendantsAndSelf("td") .FirstOrDefault(node => node.GetAttributeValue("class", string.Empty).Contains("userinfo")) ?? postNode.DescendantsAndSelf("div") .FirstOrDefault(node => node.GetAttributeValue("class", string.Empty).Contains("userinfo")); if (userIdNode == null) return user; var splitString = userIdNode .GetAttributeValue("class", string.Empty) .Split('-'); if (splitString.Length >= 2) { user.Id = Convert.ToInt64(splitString[1]); } // Remove the UserInfo node after we are done with it, because // some forums (FYAD) use it in the body of posts. Why? Who knows!11!1 userIdNode.Remove(); return user; }
public static ForumUserEntity FromUserProfile(HtmlNode profileNode, HtmlNode authorNode) { HtmlNode additionalNode = profileNode.Descendants("dl") .FirstOrDefault(node => node.GetAttributeValue("class", string.Empty).Contains("additional")); Dictionary<string, string> additionalProfileAttributes = ParseAdditionalProfileAttributes(additionalNode); var user = new ForumUserEntity { Username = authorNode.Descendants("dt") .FirstOrDefault(node => node.GetAttributeValue("class", string.Empty).Equals("author")) .InnerText, AboutUser = string.Empty, DateJoined = DateTime.Parse(additionalProfileAttributes["Member Since"]), PostCount = int.Parse(additionalProfileAttributes["Post Count"]), PostRate = additionalProfileAttributes["Post Rate"], LastPostDate = DateTime.Parse(additionalProfileAttributes["Last Post"]) }; foreach (HtmlNode aboutParagraph in profileNode.Descendants("p")) { user.AboutUser += WebUtility.HtmlDecode(aboutParagraph.InnerText.WithoutNewLines().Trim()) + Environment.NewLine + Environment.NewLine; } if (additionalProfileAttributes.ContainsKey("Seller Rating")) { user.SellerRating = additionalProfileAttributes["Seller Rating"]; } if (additionalProfileAttributes.ContainsKey("Location")) { user.Location = additionalProfileAttributes["Location"]; } return user; }