使用 xPath 从 div 获取图像 link
Get image link from div using 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>
什么都试过了,还是不行。
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();
非常感谢
您可以使用正则表达式从 CuboPlayer1
div 的 InnerHtml 中解析出 URL。
为什么父 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\-\.\?\,\/\\+&%$#_]*)?";
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\-\.\?\,\/\\+&%$#_]*)?";
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
string 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;
需要帮助从网页获取专辑封面。
<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();
非常感谢
您可以使用正则表达式从 CuboPlayer1
div 的 InnerHtml 中解析出 URL。
为什么父 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\-\.\?\,\/\\+&%$#_]*)?";
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\-\.\?\,\/\\+&%$#_]*)?";
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
string 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;