Obtenir des liens dans une DIV

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

Question

Je veux pouvoir obtenir le premier lien de l'intérieur de cette 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>

J'ai essayé avec ce code mais ça ne marche pas

    <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>

Réponse acceptée

Vous devez prendre la valeur de l' attribut href de l' élément anchor à l' aide de la méthode GetAttributeValue de HtmlAgilityPack . Vous pouvez accéder à l'élément d'ancrage unique en extrayant directement le contenu de l'élément de bloc de code parent comme ceci:

// div [@ id = 'premier tweet-wrapper'] / blockquote [@ class = 'twitter-tweet']

Puis chercher le lien unique à l'intérieur. Une solution possible pourrait ressembler à ceci (dans ce cas, l'entrée est Facebook , mais fonctionne également avec 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);
}

La sortie est dans ce cas:

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

Une autre possibilité consiste à sélectionner directement l'élément d'ancrage à l'aide de XPath (comme suggéré par @ har07):

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);
}

La sortie est la même que ci-dessus.


Réponse populaire

En supposant que votre identifiant <div> est "first-tweet-wrapper" au lieu de "firt", vous pouvez utiliser cette requête XPath pour obtenir <a> élément dans <blockquote> :

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

Donc, votre code ressemblera à ceci:

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi