YouTube HTML Agility Pack C #

c# html html-agility-pack html-parsing

Question

J'essaie de récupérer tous les identifiants de vidéos sur la page de résultats de recherche de YouTube.

Chaque résultat a ce code:

<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"> 

Et j'essaie d'analyser les données de la classe "data-video-ids". Quel est le meilleur moyen de le faire avec le HTML Agility Pack ?

J'ai essayé ceci:

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

Des idées?

Réponse acceptée

Les "données-vidéo-ids" que vous essayez de filtrer ne sont pas une classe mais un attribut - veuillez essayer l'expression suivante dans SelectNodes:

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

Pour récupérer la valeur d'attribut, vous pouvez essayer cette approche (puisque HtmlAgilityPack ne supporte pas la sélection d'attribut, vous devez d'abord obtenir un élément, puis sélectionner l'attribut réel):

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

Réponse populaire

Je pense que vous serez mieux sur le long terme si vous utilisez l'une des API de YouTube.

J'utiliserais uniquement les requêtes Web et HtmlAgilityPack en dernier recours lorsqu'aucune API n'existe. La raison principale en est que si YouTube change jamais de page, le code est cassé. Les API ouvertes sont généralement conçues pour être rétrocompatibles; votre application devrait donc fonctionner indéfiniment dans la plupart des cas.

Voici un exemple de code de l'API de 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);

Ça a l'air simple, non?



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi