YouTube HTML Agility Pack C # - PullRequest
       6

YouTube HTML Agility Pack C #

3 голосов
/ 15 марта 2011

Я пытаюсь получить все идентификаторы видео со страницы результатов поиска YouTube.

Каждый результат имеет этот код:

<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-id». Каков наилучший способ сделать это с помощью HTML Agility Pack ?

Я пробовал это:

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

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 15 марта 2011

Я думаю, что вам будет лучше в долгосрочной перспективе, если вы используете один из API YouTube .

Я бы использовал веб-запросы и HtmlAgilityPack только в крайнем случае, когда API не существует. Основная причина этого в том, что если YouTube когда-либо изменит свою страницу, это нарушит ваш код. Открытые API, как правило, ориентированы на обратную совместимость, поэтому в большинстве случаев ваше приложение должно работать бесконечно.

Вот пример кода из API Youtube:

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

Выглядит просто, верно?

3 голосов
/ 15 марта 2011

Данные-видео-идентификаторы, которые вы пытаетесь отфильтровать, - это не класс, а атрибут - попробуйте следующее выражение в 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;
}
...