Web Scraper не возвращает правильный URL - PullRequest
0 голосов
/ 11 февраля 2020

Поэтому я пытаюсь разработать консольное приложение для веб-скребка в c#. У меня проблемы с получением ссылок на посты с этого сайта. Hacker News

Я могу получить все, кроме ссылки. Когда я пытаюсь получить ссылку, она возвращает мне ссылку для голосования, а не ссылку для публикации, хотя я полагаю, что выбираю правильные теги.

Мой код:

var postsHTML = htmlDocument.DocumentNode.Descendants("table")
    .Where(node => node.GetAttributeValue("class", "")
    .Equals("itemlist")).ToList();

var postList = postsHTML[0].Descendants("tr")
    .Where(node => node.GetAttributeValue("class", "")
    .Equals("athing")).ToList();

И затем в моем foreach l oop для доступа к элементам в массиве и для получения ссылки я ввожу это:

foreach (var post in postList)
{

    Console.WriteLine("Title: " + post.Descendants("a")
        .Where(node => node.GetAttributeValue("class", "")
        .Equals("storylink")).FirstOrDefault().InnerText);


    Console.WriteLine("URI: " + post.Descendants("a").FirstOrDefault()
        .GetAttributeValue("href", ""));

    Console.WriteLine();

}

Это возвращает название правильно, но мой URI, похоже, выглядит как

Название: Самые известные книги Жюля Верна были частью шедевра из 54 томов

URI: голосование? Id = 22292003 & how = up & goto = news

, и ссылка, которую я ожидаю вернуть, - это ссылка на сообщение:

URI: http://www.openculture.com/2020/02/jules-vernes-voyages-extraordinaires.html

1 Ответ

1 голос
/ 11 февраля 2020

Вы выбираете неправильный тег во второй раз. Вам следует повторно использовать один и тот же селектор, поскольку заголовок и URL-адрес находятся в одном теге.

var storyLink = post.Descendants("a")
    .Where(node => node.GetAttributeValue("class", "")
    .Equals("storylink")).FirstOrDefault();

Console.WriteLine("Title: " + storyLink.InnerText);


Console.WriteLine("URI: " + storyLink.GetAttributeValue("href", ""));
...