通过C#从网站获取特定内容

时间:2016-11-30 10:44:27

标签: c# html

对于非商业私立学校项目我正在创建一个软件,根据Spotify当前播放的歌曲搜索歌词。我必须在C#(要求)中这样做,但如果我愿意,我可以使用其他语言。

我找到了一些可以用来获取歌词的网站。我已经成功获取了整个HTML代码,但之后我不知道该怎么做。我问过我的老师,她告诉我使用XML(我也发现很复杂:p),所以我已经阅读了很多关于它并搜索了一些例子,但是没有发现任何看起来适用于我的情况

某些代码的时间。

假设我想从musixmatch.com获取歌词:

(人类可读的改动)HTML:

<span data-reactid="199">
    <p class="mxm-lyrics__content" data-reactid="200">First line of the lyrics!
        These words will never be ignored
        I don't want a battle
    </p>
    <!-- react-empty: 201 -->
    <div data-reactid="202">
        <div class="inline_video_ad_container_container" data-reactid="203">
            <div id="inline_video_ad_container" data-reactid="204">
                <div class="" style="line-height:0;" data-reactid="205">
                    <div id="div_gpt_ad_outofpage_musixmatch_desktop_lyrics" data-reactid="206">
                        <script type="text/javascript">
                            //Really nice google ad JS which I have removed;
                        </script>
                    </div>
                </div>
            </div>
        </div>
        <p class="mxm-lyrics__content" data-reactid="207">But I got a war
            More fancy lyrics
            And lines
            That I want to fetch
            And display
            Tralala
            lala
            Trouble!
        </p>
    </div>
</span>

请注意,歌词的前三行位于顶部,其余部分位于底部<p>。另请注意,两个<p>标记具有相同的类。 完整的html源代码可以在这里找到: view-source:https://www.musixmatch.com/lyrics/Bullet-for-My-Valentine/You-Want-a-Battle-Here%E2%80%99s-a-War在第97行附近,代码段开始。

所以在这个具体的例子中有歌词,并且有很多我不需要的代码。到目前为止,我已经尝试使用以下C#获取html代码:

string source = "https://www.musixmatch.com/lyrics/Bullet-for-My-Valentine/You-Want-a-Battle-Here’s-a-War";

    // The HtmlWeb class is a utility class to get the HTML over HTTP
    HtmlWeb htmlWeb = new HtmlWeb();

    // Creates an HtmlDocument object from an URL
    HtmlAgilityPack.HtmlDocument document = htmlWeb.Load(source);

    // Targets a specific node
    HtmlNode someNode = document.GetElementbyId("mxm - lyrics__content");

    if (someNode != null)
    {
        Console.WriteLine(someNode);
    } else
    {
        Console.WriteLine("Nope");
    }

    foreach (var node in document.DocumentNode.SelectNodes("//span/div[@id='site']/p[@class='mxm-lyrics__content']"))
    {
        // here is your text: node.InnerText    "//div[@class='sideInfoPlayer']/span[@class='wrap']"
        Console.WriteLine(node.InnerText);
    }

    Console.ReadKey();

整个html的获取工作,但提取没有。 我坚持从html中提取歌词。由于此页面的歌词不在ID标签中,我不能只使用GetElementbyId有人可以指出我正确的方向吗?我想支持多个网站,所以我必须为不同的网站做几次。

1 个答案:

答案 0 :(得分:2)

其中一个解决方案

var htmlWeb = new HtmlWeb();
var documentNode = htmlWeb.Load(source).DocumentNode;

var findclasses = documentNode.Descendants("p")
    .Where(d => d.Attributes["class"]?.Value.Contains("mxm-lyrics__content") == true);
//or
var findclasses = documentNode.SelectNodes("//p[contains(@class,'mxm-lyrics__content')]")
var text = string.Join(Environment.NewLine, findclasses.Select(x => x.InnerText));