여기 내가 지금까지 가지고있는 것이있다.
HtmlAgilityPack.HtmlDocument ht = new HtmlAgilityPack.HtmlDocument();
TextReader reader = File.OpenText(@"C:\Users\TheGateKeeper\Desktop\New folder\html.txt");
ht.Load(reader);
reader.Close();
HtmlNode select= ht.GetElementbyId("cats[]");
List<HtmlNode> options = new List<HtmlNode>();
foreach (HtmlNode option in select.ChildNodes)
{
if (option.Name == "option")
{
options.Add(option);
}
}
이제 select 요소에 대한 모든 "옵션"목록이 있습니다. 키와 텍스트를 얻기 위해 어떤 속성에 액세스해야합니까?
예를 들어, 한 옵션에 대한 html은 다음과 같습니다.
<option class="level-1" value="1">Funky Town</option>
나는 결과물을 얻고 싶다 :
1 - Funky Town
감사
편집 : 방금 뭔가 발견. "Select"요소의 자식 요소를 가져 왔을 때 "option"유형의 요소와 "#text"유형의 요소를 반환했습니다.
흠 .. #text에는 내가 원하는 문자열이 있지만 select에 값이 있습니다.
HTMLAgilityPack은 html 파서였습니다. 왜 이렇게 혼란스러운 가치를 갖게 되었습니까?
이는 html 파서의 기본 구성 때문입니다. <option>
을 HtmlElementFlag.Empty로 구성했습니다 (주석에 '때때로 포함하고 있으며 때로는 포함하지 않습니다 ...'). <form>
태그는 자식 노드없이 DOM에 빈 노드로 표시되도록하는 동일한 설정 (CanOverlap + Empty)을 갖습니다.
문서를 구문 분석하기 전에 해당 플래그를 제거해야합니다.
HtmlNode.ElementsFlags.Remove("option");
ElementsFlags 속성은 정적이며 모든 변경 내용이 이후의 모든 구문 분석에 영향을줍니다.
편집 : 아마도 xpath를 통해 option
노드를 직접 선택해야합니다. 나는 이것이 이것을 위해 일해야한다고 생각한다.
var options = select.SelectNodes("option");
그러면 텍스트 노드없이 옵션을 얻을 수 있습니다. 옵션에는 원하는 문자열이 있어야합니다. html 샘플을 기다리고 있습니다.
foreach (var option in options)
{
int value = int.Parse(option.Attributes["value"].Value);
string text = option.InnerText;
}
에이
속성에 대한 온 전성 검사를 추가하여 존재 여부를 확인할 수 있습니다.