我正在WPF中制作一首mp3歌曲。它的作用是从网页中获取所有结果。我遇到的问题是它获取不相关的数据,如标签,链接(不是下载的)等。
我想要的是仅从网页中获取结果和下载链接并将其显示在列表框中。
任何帮助都将不胜感激!!
答案 0 :(得分:2)
使用HtmlAgilityPack执行此操作非常简单。您只需加载文档,然后使用简单的XPath expressions选择所需的标记:
using HtmlAgilityPack;
using System;
using System.Text;
namespace com.mp3skull.scrapper
{
class Program
{
private static void Main(string[] args)
{
var p = new Program();
HtmlNodeCollection songs = p.GetSongNodesFromPage("http://mp3skull.com/mp3/move_that_dope.html");
p.WriteSongsToConsole(songs);
Console.WriteLine("Press any key to continue..");
Console.ReadKey();
}
private readonly HtmlWeb web = new HtmlWeb();
private HtmlNodeCollection GetSongNodesFromPage(string pageUri)
{
HtmlDocument document = web.Load(pageUri);
HtmlNode documentNode = document.DocumentNode;
return documentNode.SelectNodes("//div[@id='song_html']");
}
private void WriteSongsToConsole(HtmlNodeCollection songs)
{
foreach (HtmlNode s in songs)
{
HtmlNode titleNode = s.SelectSingleNode(".//b"); // Title is bold
string title = titleNode.InnerText;
HtmlNode downloadLinkNode = s.SelectSingleNode(".//a[@style='color:green;']"); // Download links is green
string downloadLink = downloadLinkNode.Attributes["href"].Value;
HtmlNode songInfoNode = s.SelectSingleNode("./div[@class='left']");
string songInfo = GetSongInfoLine(songInfoNode);
Console.WriteLine("Title: {0}\t", title);
Console.WriteLine("Information: {0}\t", songInfo);
Console.WriteLine("Download link: {0}\t", downloadLink);
Console.WriteLine();
}
}
private string GetSongInfoLine(HtmlNode songInfoNode)
{
var textNodes = songInfoNode.Descendants("#text");
var infoBuilder = new StringBuilder();
foreach (var node in textNodes)
{
if (infoBuilder.Length > 0)
{
infoBuilder.Append(", ");
}
infoBuilder.Append(node.InnerText.Trim());
}
return infoBuilder.ToString();
}
}
}
答案 1 :(得分:0)
如果您不知道从哪里开始,那么学习正则表达式就是您要去的地方。
使用正则表达式,您可以将HTML代码分解为相关标签,然后执行您要做的任何事情。
这个地方真的是我所知道的关于正则表达式的最好的地方之一:http://www.regular-expressions.info/
另外,为了测试正则表达式,有一个名为The regex coach的漂亮工具,对测试和学习正则表达式非常有用:http://www.weitz.de/regex-coach/