使用xPath从div获取图像链接

时间:2017-07-06 16:32:13

标签: c# html xpath uwp html-agility-pack

需要帮助才能从网页上获取专辑封面。

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

非常感谢

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式从CuboPlayer1 div的InnerHtml中解析出网址。 为什么父母div而不是封面本身?因为HtmlAgilityPack存在问题,它无法解析Attributes["style"].Value内的引号,这就是您需要转到父节点CuboPlayer1并手动从中提取URL的原因而是整个HTML。

您可以使用以下代码执行此操作:

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;