YouTube HTML-Agilitätspaket C #

c# html html-agility-pack html-parsing

Frage

Ich versuche, alle Video-IDs von der Suchergebnisseite von YouTube abzurufen.

Jedes Ergebnis hat diesen 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"> 

Und ich versuche, die Klassendaten "Daten-Video-IDs" zu analysieren. Was ist der beste Weg, dies mit dem HTML Agility Pack zu tun?

Ich habe das versucht:

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

Irgendwelche Ideen?

Akzeptierte Antwort

Die Daten-Video-IDs, die Sie herausfiltern möchten, sind keine Klasse, sondern ein Attribut. Probieren Sie bitte den folgenden Ausdruck in SelectNodes aus:

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

Um den Attributwert abzurufen, können Sie diesen Ansatz versuchen (da HtmlAgilityPack keine Attributauswahl unterstützt, müssen Sie zuerst ein Element abrufen und dann das tatsächliche Attribut auswählen):

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

Beliebte Antwort

Ich denke, Sie werden langfristig besser dran sein, wenn Sie eine der YouTube- APIs verwenden .

Ich würde Web-Anfragen und HtmlAgilityPack nur als letzten Ausweg verwenden, wenn keine API existiert. Der Hauptgrund dafür ist, dass YouTube, wenn es seine Seite ändert, deinen Code bricht. Open APIs sind in der Regel abwärtskompatibel, sodass Ihre Anwendung in den meisten Fällen unbegrenzt funktionieren sollte.

Hier ist ein Codebeispiel von Youtubes 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);

Sieht einfach aus, oder?



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum