Получить ссылки внутри DIV

.net c# html-agility-pack windows-phone-8 xpath

Вопрос

Я хочу иметь возможность получить первую ссылку из этого div.

    <div id="first-tweet-wrapper">
    <blockquote class="tweet" lang="en">
    <a href="htttp://link.com">                          <--- This one
      text    </a>
  </blockquote>
  <a href="http://link2.net" class="click-tracking" target="_blank"
     data-tracking-category="discover" data-tracking-action="tweet-the-tweet">
    Tweet it!  </a>
</div>

Я пробовал с этим кодом, но он не работает

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(source);

var div = doc.DocumentNode.SelectSingleNode("//div[@id='first-tweet-wrapper']");
if (div != null)
{
      var links = div.Descendants("a")
          .Select(a => a.InnerText)
          .ToList();
}

Принятый ответ

Вы должны принять значение атрибута href элемента привязки, используя метод GetAttributeValue HtmlAgilityPack . Вы можете получить доступ к одиночному элементу привязки, извлекая непосредственно содержимое элемента родительского элемента блока следующим образом:

// DIV [@ ид = 'первый-твит-обертка'] / BLOCKQUOTE [@ класс = 'щебетать-чирикать']

Затем введите одиночную ссылку внутри. Возможное решение может выглядеть так (в этом случае вход - facebook , но также работает с Microsoft ):

try
{           
    // download the html source
    var webClient = new WebClient();
    var source = webClient.DownloadString(@"https://discover.twitter.com/first-tweet?username=facebook#facebook");
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(source);

    var div = doc.DocumentNode.SelectSingleNode("//div[@id='first-tweet-wrapper']/blockquote[@class='twitter-tweet']");
    if (div != null)
    {
        // there is only one links
        var link = div.Descendants("a").FirstOrDefault();
        if (link != null)
        {
            // take the value of the attribute
            var href = link.GetAttributeValue("href", "");
            Console.WriteLine(href);
        }
    }
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}

Вывод в этом случае:

https://twitter.com/facebook/statuses/936094700

Другая возможность заключается в непосредственном выборе элемента привязки с использованием XPath (например, предлагаемого @ har07):

    var xpath = @"//div[@id='first-tweet-wrapper']/blockquote[@class='twitter-tweet']/a";
    var link = doc.DocumentNode.SelectSingleNode(xpath);
    if (link != null)
    {
        // take the value of the href-attribute
        var href = link.GetAttributeValue("href", "");
        Console.WriteLine(href);
    }

Выход такой же, как и выше.


Популярные ответы

Предполагая, что ваш <div> id является «first-tweet-wrapper» вместо «firt», вы можете использовать этот запрос XPath для получения элемента <a> внутри <blockquote> :

//div[@id='first-tweet-wrapper']/blockquote/a

Таким образом, ваш код будет выглядеть примерно так:

var a = doc.DocumentNode
             .SelectSingleNode("//div[@id='first-tweet-wrapper']/blockquote/a");
if (a != null)
{
      var text = a.InnerText;
      var link = a.GetAttributeValue("href", "");
}


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow