2017-07-06 177 views
0

需要幫助才能從網頁獲取專輯封面。使用xPath從div獲取圖像鏈接

<div class="cover" style="background-image: url("http://is5.mzstatic.com/image/thumb/Music/v4/68/b5/08/68b50896-607e-2950-3530-de172fdbf878/source/100x100bb.jpg");"></div> 

嘗試了一切,但沒有任何作品。

HttpClient http = new HttpClient(); 
var response = await http.GetByteArrayAsync("http://www.antena1.com.br/stream/player"); 
String source = Encoding.GetEncoding("utf-8").GetString(response, 0, response.Length - 1); 
source = WebUtility.HtmlDecode(source); 
HtmlDocument resultat = new HtmlDocument(); 
resultat.LoadHtml(source); 

HtmlNode nodes1 = resultat.DocumentNode.SelectSingleNode("//*[@id='CuboPlayer1']/div[1]"); 


txtImgLink.Text = nodes1.ToString(); 

非常感謝

+0

哪裏是'CuboPlayer1'在上面的'DIV '元素?它是父母嗎? – SomeDude

+0

我需要的是在CuboPlayer1 div內。 – Toni0123

回答

1

您可以使用正則表達式來從你CuboPlayer1 DIV的innerHTML解析出URL。 爲什麼父母的div而不是封面本身?由於HtmlAgilityPack存在問題,無法解析Attributes["style"].Value中的引號,因此您需要轉到父節點CuboPlayer1並手動從整個HTML中提取URL。

你可以做到這一點與此代碼:

string nodeHTML = resultat.DocumentNode 
    .SelectSingleNode("//div[@id='CuboPlayer1']").InnerHtml; 

string pattern = @"(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\/\\\+&amp;%\$#_]*)?"; 

Regex regex = new Regex(pattern, RegexOptions.IgnoreCase); 
string backgroundURL = regex.Match(nodeHTML).Value; 

我測試了這個使用下面的代碼和它的工作原理:

using System; 
using System.Text.RegularExpressions; 
using System.Xml; 
using HtmlAgilityPack; 

public class Program 
{ 
    public static void Main() 
    { 
     var html = 
     "<div id=\"CuboPlayer1\"><div class=\"cover\" style=\"background-image: url(\"http://is5.mzstatic.com/image/thumb/Music/v4/68/b5/08/68b50896-607e-2950-3530-de172fdbf878/source/100x100bb.jpg\");\"></div></div>"; 

     var htmlDoc = new HtmlDocument(); 
     htmlDoc.LoadHtml(html); 

     string nodeHTML = htmlDoc.DocumentNode 
      .SelectSingleNode("//div[@id='CuboPlayer1']").InnerHtml; 

     string pattern = @"(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\/\\\+&amp;%\$#_]*)?"; 
     Regex regex = new Regex(pattern, RegexOptions.IgnoreCase); 
     string backgroundURL = regex.Match(nodeHTML).Value; 

     Console.WriteLine(backgroundURL); 
    } 
} 

編輯: 沒有與你想要什麼樣的問題實現,因爲背景圖像不斷變化。根據文檔加載時屏幕上顯示的內容,您可能無法獲取任何URL,因爲沒有顯示封面。

在任何情況下,直接在你與使用網址,而不是靜態HTML的像我的第一個例子中的工作頁面指向這裏的更新代碼:

var url = "http://www.antena1.com.br/stream/player"; 
var web = new HtmlWeb(); 
var htmlDoc = web.Load(url); 

// Convert each line of HTML into a list of strings 
List<string> nodeHTML = htmlDoc.DocumentNode 
    .SelectSingleNode("//div[@id='CuboPlayer1']").InnerHtml.Split('\n').ToList(); 

// Find div with "cover" attribute 
string coverHTML = nodeHTML.Where(n => n.Contains("<div class=\"cover\"")).FirstOrDefault(); 

// Define regular expression to match 
string pattern = @"(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\/\\\+&%\$#_]*)?"; 
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase); 

// Extract backgroundURL 
string backgroundURL = regex.Match(coverHTML).Value; 
+0

當我使用您提供的var html時,它可以工作,但使用「http://www.antena1.com.br/stream/player」來獲取數據不起作用。非常感謝 – Toni0123

+0

我更新了代碼,但您可能無法獲得初始頁面加載的封面。 – Arman

+0

它的工作原理,但我得到http://www.antenna1.fm/這是裏面:

Toni0123