如何从html网页获取特定数据

时间:2014-04-25 11:39:58

标签: c# html wpf

我正在WPF中制作一首mp3歌曲。它的作用是从网页中获取所有结果。我遇到的问题是它获取不相关的数据,如标签,链接(不是下载的)等。

我想要的是仅从网页中获取结果和下载链接并将其显示在列表框中。

任何帮助都将不胜感激!!

来自此链接:http://mp3skull.com/mp3/move_that_dope.html

2 个答案:

答案 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/