YouTube HTML 민첩성 팩 C #

c# html html-agility-pack html-parsing

문제

YouTube의 검색 결과 페이지에서 모든 동영상 ID를 검색하려고합니다.

각 결과에는 다음과 같은 코드가 있습니다.

<a href="/watch?v=aYIC-ebAD3o" class="ux-thumb-wrap result-item-thumb">
  <span class="video-thumb ux-thumb-128 ">
    <span class="clip">
      <img onload="tn_load(5)" alt="Thumbnail" src="//i2.ytimg.com/vi/aYIC-ebAD3o/default.jpg" >
    </span>
  </span>
  <span class="video-time">4:16</span>
  <span dir="ltr" class="yt-uix-button-group addto-container short video-actions" data-video-ids="aYIC-ebAD3o" data-feature="thumbnail">
    <button type="button" class="start master-sprite  yt-uix-button yt-uix-button-short yt-uix-tooltip" onclick=";return false;" title="" data-button-action="yt.www.addtomenu.add" role="button" aria-pressed="false">
      <img class="yt-uix-button-icon yt-uix-button-icon-addto" src="//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif" alt="">
        <span class="yt-uix-button-content">
          <span class="addto-label">Add to</span>
        </span>
    </button>
    <button type="button" class="end  yt-uix-button yt-uix-button-short yt-uix-tooltip yt-uix-button-empty" onclick=";return false;" title="" data-button-menu-id="shared-addto-menu" data-button-action="yt.www.addtomenu.load" role="button" aria-pressed="false">
      <img class="yt-uix-button-arrow" src="//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif" alt="">
    </button>
  </span>
  <span class="video-in-quicklist">Added to queue    </span>
</a>
<div class="result-item-main-content"> 

그리고 "data-video-ids"클래스 데이터를 파싱하려고합니다. HTML Agility Pack 으로이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

나는 이것을 시도했다.

foreach(HtmlNode node in doc.DocumentNode.
    SelectNodes("//span[@class='data-video-ids']"))
{
    string text = node.InnerText;
    lblTest2.Text += text + Environment.NewLine;
}

어떤 아이디어?

수락 된 답변

필터링하려는 'data-video-ids'는 클래스가 아니라 속성입니다. SelectNodes에서 다음 표현식을 사용해보십시오.

"//span[@data-video-ids]"

속성 값을 검색하려면이 방법을 시도해 볼 수 있습니다 (HtmlAgilityPack은 속성 선택을 지원하지 않으므로 먼저 요소를 가져 와서 실제 속성을 선택해야합니다).

foreach(HtmlNode node in doc.DocumentNode.
    SelectNodes("//span[@data-video-ids]"))
{
    var videoIds = node.Attributes["data-video-ids"];
    if (videoIds == null) continue;

    string text = videoIds.Value;
    lblTest2.Text += text + Environment.NewLine;
}

인기 답변

YouTube API 중 하나를 사용하면 장기간 사용하면 더 나아질 것입니다.

API가없는 경우 웹 요청과 HtmlAgilityPack 만 최후의 수단으로 사용합니다. 주된 이유는 YouTube에서 페이지를 변경하면 코드가 손상 될 수 있기 때문입니다. 공개 API는 일반적으로 하위 호환이 가능하도록 설계되어 있으므로 대부분의 경우 애플리케이션이 무기한으로 작동해야합니다.

다음은 Youtube의 API 코드 예제입니다.

YouTubeQuery query = new YouTubeQuery(YouTubeQuery.DefaultVideoUri);

//order results by the number of views (most viewed first)
query.OrderBy = "viewCount";

// search for puppies and include restricted content in the search results
// query.SafeSearch could also be set to YouTubeQuery.SafeSearchValues.Moderate
query.Query = "puppy";
query.SafeSearch = YouTubeQuery.SafeSearchValues.None;

Feed<Video> videoFeed = request.Get<Video>(query);

printVideoFeed(videoFeed);

단순 해 보이지?



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