C# 使用xPath从div获取图像链接

C# 使用xPath从div获取图像链接,c#,html,xpath,uwp,html-agility-pack,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> 非常感谢您可以使用正则表达式从CuboPlayer1div的内部HTML解析出URL。 为什么是父di

需要帮助从网页获取相册封面

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

非常感谢

您可以使用正则表达式从
CuboPlayer1
div的内部HTML解析出URL。 为什么是父div而不是封面本身?因为HtmlAlityPack存在一个问题,它无法解析出
属性[“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);
    }
}
使用系统;
使用System.Text.RegularExpressions;
使用System.Xml;
使用HtmlAgilityPack;
公共课程
{
公共静态void Main()
{
变量html=
"";
var htmlDoc=新的HtmlDocument();
htmlDoc.LoadHtml(html);
字符串nodeHTML=htmlDoc.DocumentNode
.SelectSingleNode(“//div[@id='CuboPlayer1']”);
字符串模式=@“(ht-f)tp(s?):\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)**)(\/?)([a-zA-Z0-9\-.\.\,\/\+&;%$\$\\\\\\.*)?”;
Regex Regex=new Regex(模式,RegexOptions.IgnoreCase);
字符串backgroundURL=regex.Match(nodeHTML).Value;
Console.WriteLine(backgroundURL);
}
}
编辑: 你想要达到的目标有一个问题,背景图像在不断变化。根据加载文档时屏幕上显示的内容,您可能无法返回任何URL,因为没有显示封面

在任何情况下,以下更新的代码直接指向您正在使用的页面,使用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;
var url=”http://www.antena1.com.br/stream/player";
var web=新的HtmlWeb();
var htmlDoc=web.Load(url);
//将每行HTML转换为字符串列表
列表nodeHTML=htmlDoc.DocumentNode
.SelectSingleNode(“//div[@id='CuboPlayer1']”)。InnerHtml.Split('\n')。ToList();
//查找具有“cover”属性的div

string coverHTML=nodeHTML.Where(n=>n.Contains(“Where is
CuboPlayer1
在上面的
div
元素中?它是父元素吗?我需要的div在CuboPlayer1 div中。当我使用您提供的var html时,它工作,但使用”"要获取数据,它不起作用。感谢lotI更新了代码,但您可能无法在初始页面加载时获取封面。它起作用,但我得到的是内部:我得到的是空字符串,尽管封面div不是空的。我不知道我做错了什么。感谢幸运的是,正如我提到的,页面HTML是动态的,所以当HTML agility pack first加载页面时,没有封面内容。封面URL仅在播放机成功建立连接后显示。您可能需要研究处理页面动态特性的方法。
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;