정규식을 HtmlAgilityPack C #

c# html-agility-pack regex

문제

HtmlAgilityPack 라이브러리를 사용하는 다른 웹 사이트의 문자열과 일치시키기 위해 regex를 사용하는 코드를 변환하는 방법을 알고 싶습니다.

예제 코드 :

<div class="element"><div class="title"><a href="127.0.0.1" title="A.1">A.1</a></div></div>
<div class="element"><div class="title"><a href="127.0.0.1" title="A.2">A.2</a></div></div>

내 현재 코드는 다음과 같습니다.

List<string> Cap = new List<string>();
WebClient web = new WebClient();
string url = web.DownloadString("127.0.0.1");
MatchCollection cap = Regex.Matches(url, "title=\"(.+?)\">", RegexOptions.Singleline);
foreach (Match m in cap)
{
     Cap.Add(m.Groups[1].Value.ToString());
}
lst_Cap.ItemsSource = Cap;

그리고 그것은 작동합니다.

나는 HtmlAgilityPack으로 시도했다.

HtmlDocument Web = web.Load("127.0.0.1"); // 127.0.0.1 for example
List<string> Cap = new List<string>();
foreach (HtmlNode node in Web.DocumentNode.SelectNodes("//*[@id=\"content\"]/div/div[3]/div[2]/div[1]/a"))
{
    Cap.Add(node.InnerHtml);
}

그러나 A.1 만 추가합니다.

어떻게해야합니까?

수락 된 답변

정규 표현식 "title=\"(.+?)\">" 은 HTML 문서 내의 모든 태그에서 제목 속성을 일치시키고 캡처합니다.

따라서, title 속성을 포함하는 임의의 요소 노드 ( * )를 얻는 //*[@title] XPath와 함께 다른 코드를 사용하고 속성 노드를 반복하고 이름이 title 이되면 목록에 값을 추가하십시오.

var nodes = Web.DocumentNode.SelectNodes("//*[@title]");
if (nodes != null)
{
   foreach (var node in nodes)
   {
       foreach (var attribute in node.Attributes)
           if (attribute.Name == "title")
               Cap.Add(attribute.Value);
   }
}

또는 LINQ 사용 :

var nodes = Web.DocumentNode.SelectNodes("//*[@title]");
var res = nodes.Where(p => p.HasAttributes)
                 .Select(m => m.GetAttributeValue("title", string.Empty))
                 .Where(l => !string.IsNullOrEmpty(l))
                 .ToList();



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