2011-03-15 131 views
3

我試圖從YouTube的搜索結果頁面檢索所有視頻ID。YouTube HTML敏捷包C#

每個結果都有這樣的代碼:

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

,我試圖分析出「數據的視頻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; 
} 

任何想法?

回答

3

的「數據視頻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; 
} 
+0

它的作品,但它不檢索我後的信息。我希望爲aYIC-ebAD3o,但相反返回添加到 – mintuz 2011-03-15 18:14:59

+0

請看到更新的答案:) – 2011-03-15 18:59:38

5

我想如果你使用YouTube的APIs之一,你會在longrun中過得更好。

如果沒有API存在,我只會使用web請求和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); 

看起來簡單,不是嗎?

+0

我嘗試了API,但無法得到它的工作。在用戶輸入關鍵字後,我想要一個與該關鍵字相關的視頻列表並顯示該網址,但我無法獲得顯示的視頻列表。 – mintuz 2011-03-15 18:16:14

+1

我仍然認爲讓API運作起來會更好。 YouTube在更改HTML後停止工作時會發生什麼?你修復它。他們再改變一次?你修復它...獲得想法?我敢打賭,網上有很多資源和例子可以讓它工作。 – jonathanpeppers 2011-03-15 18:17:56

+0

請查看此網址.Net http://code.google.com/apis/youtube/2.0/developers_guide_dotnet.html – jonathanpeppers 2011-03-15 18:19:19