2017-07-06 1 views
0

Besoin d'aide pour obtenir la couverture de l'album depuis la page Web.Obtenir l'image link de div en utilisant xPath

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

Essayé tout mais rien ne fonctionne.

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(); 

Merci beaucoup

+0

Où se trouve 'CuboPlayer1' dans ce qui précède' div 'élément? Est-ce parent? – SomeDude

+0

div dont j'ai besoin est à l'intérieur de CuboPlayer1 div. – Toni0123

Répondre

1

Vous pouvez utiliser une expression régulière pour analyser l'URL de la InnerHtml de votre CuboPlayer1 div. Pourquoi le parent div et pas la couverture elle-même? Parce qu'il y a un problème avec le HtmlAgilityPack où il ne peut pas analyser les guillemets à l'intérieur de Attributes["style"].Value, c'est pourquoi vous devez aller au nœud parent CuboPlayer1 et extraire manuellement l'URL de tout le HTML à la place.

Vous pouvez le faire avec ce code:

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; 

J'ai testé cela en utilisant le code ci-dessous et cela fonctionne:

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

EDIT: Il y a un problème avec ce que vous essayez pour atteindre, en ce que l'image de fond est en constante évolution. En fonction de ce qui apparaît à l'écran au moment du chargement du document, il se peut que vous ne récupériez aucune URL car aucune couverture n'est affichée.

Dans tous les cas, le code est mis à jour ici qui pointe directement à la page que vous travaillez avec l'aide de votre URL au lieu de HTML statique comme mon premier exemple:

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

Lorsque j'utilise var html vous avez fourni, cela fonctionne, mais en utilisant "http://www.antena1.com.br/stream/player" pour obtenir des données, cela ne fonctionne pas. Merci beaucoup – Toni0123

+0

J'ai mis à jour le code, mais vous ne pouvez pas être en mesure d'obtenir la couverture sur le chargement initial de la page. – Arman

+0

Cela fonctionne mais je reçois http://www.antenna1.fm/ qui est à l'intérieur:

Toni0123