YouTube HTML Agility Pack C #

Я пытаюсь получить все идентификаторы видео со страницы результатов поиска 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;
}

Любые идеи?


person mintuz    schedule 15.03.2011    source источник


Ответы (2)


Идентификаторы видео-данных, которые вы пытаетесь отфильтровать, - это не класс, а атрибут - попробуйте следующее выражение в 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;
}
person Denis Ivin    schedule 15.03.2011
comment
он работает, но не получает информацию, которую я ищу. я надеялся на aYIC-ebAD3o, но вместо этого возвращается добавить к - person mintuz; 15.03.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);

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

person jonathanpeppers    schedule 15.03.2011
comment
Я попробовал api, но не смог заставить его работать. после того, как пользователь ввел ключевое слово, мне нужен список видео, связанных с этим ключевым словом, и отображать URL-адрес, однако мне не удалось получить список отображаемых видео. - person mintuz; 15.03.2011
comment
Я все еще думаю, что вам было бы намного лучше, если бы API работал. Что произойдет, если ваш код перестанет работать после того, как YouTube изменит свой HTML? Вы это исправите. Они снова его меняют? Вы почините это ... Поняли? Я готов поспорить, что в Интернете есть много ресурсов и примеров, чтобы заставить его работать. - person jonathanpeppers; 15.03.2011
comment
См. Этот URL для .Net code.google.com/apis/youtube/2.0/ developers_guide_dotnet.html - person jonathanpeppers; 15.03.2011
comment
Просто имейте в виду, что у них могут быть ограничения квоты (максимальное количество запросов, ограниченные результаты поиска и т. Д.) Для API, что может быть проблемой для приложений, выполняющих массовый поиск данных (code.google.com/apis/youtube/faq.html#quota). - person Denis Ivin; 15.03.2011
comment
Да, пробовал использовать этот код ранее, но не смог узнать, где можно сохранить URL-адрес каждого видео в списке. у него есть только метаинформация, такая как описание и т. д., и как бы вы разместили каждый URL-адрес в отдельной строке в текстовом поле из API. Я согласен, было бы лучше, я просто не могу заставить его работать. Я получил вышеуказанный пост, но мне больше нравится метод api. - person mintuz; 16.03.2011