HTMLAgilityPack을 사용하여 select 요소의 모든 값 가져 오기

c# html-agility-pack winforms

문제

여기 내가 지금까지 가지고있는 것이있다.

            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은 다음과 같습니다.

            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);
            }
        }

나는 결과물을 얻고 싶다 :

            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"요소의 자식 요소를 가져 왔을 때 "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 샘플을 기다리고 있습니다.

var options = select.SelectNodes("option");

}

에이
속성에 대한 온 전성 검사를 추가하여 존재 여부를 확인할 수 있습니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.