/// <summary> /// HTMLを解析し、ノードのリストを生成する /// </summary> /// <returns></returns> public HtmlNodeList Parse() { HtmlNodeList nodeList = new HtmlNodeList(); bool isScript = false; //HTMLを終端まで移動していく while (!MoveNext()) { //タグの開始の場合 if (Current == '<') { if (IsComment) { MoveToCommentEnd(); } else { HtmlNode node = ParseTag(); if (node != null) { //Console.WriteLine("<{0}>", node.NodeType == NodeType.EndTag ? "/" + node.TagName : node.TagName); //foreach (String key in node.Attributes.Keys) //{ // Console.WriteLine("属性:{0}={1}", key, node.Attributes[key]); //} nodeList.Add(node); if (node.NodeType == NodeType.Tag && node.TagName.Equals("script", StringComparison.OrdinalIgnoreCase)) { isScript = true; } else if (node.NodeType == NodeType.EndTag && node.TagName.Equals("script", StringComparison.OrdinalIgnoreCase)) { isScript = false; } } } } //それ以外の場合 else { HtmlNode node = ParseText(isScript); if (node != null) { //Console.WriteLine((node as HtmlTextNode).Text); nodeList.Add(node); } } } return nodeList; }
/// <summary> /// 指定されたタグ名のコレクションを返す /// </summary> /// <param name="tagName"></param> /// <returns></returns> public HtmlNodeList GetNodesByTagName(String tagName) { HtmlNodeList nodeList = new HtmlNodeList(); foreach (HtmlNode node in _allNodes) { if ((node.NodeType == NodeType.SelfComplete || node.NodeType == NodeType.Tag) && node.TagName.Equals(tagName, StringComparison.OrdinalIgnoreCase)) { nodeList.Add(node); } } return nodeList; }
/// <summary> /// 指定されたテキストを含む直近の親のタグのコレクションを返す /// </summary> /// <param name="text"></param> /// <returns></returns> public HtmlNodeList GetNodesByText(String text) { HtmlNodeList nodeList = new HtmlNodeList(); foreach (HtmlNode node in _allNodes) { if (node.NodeType == NodeType.Tag) { if (node.InnerText.Contains(text)) { nodeList.Add(node); } } } return nodeList; }
/// <summary> /// 属性の値に指定された文字を含むタグのコレクションを返す /// </summary> /// <param name="value"></param> /// <returns></returns> public HtmlNodeList GetNodesByAttribute(String text) { HtmlNodeList nodeList = new HtmlNodeList(); foreach (HtmlNode node in _allNodes) { if (node.NodeType == NodeType.Tag || node.NodeType == NodeType.SelfComplete) { foreach (String value in node.Attributes.Values) { if (value != null && value.Contains(text)) { nodeList.Add(node); break; } } } } return nodeList; }