Ich möchte in der Lage sein, den ersten Link aus diesem div zu bekommen.
<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>
Ich habe es mit diesem Code versucht, aber es funktioniert nicht
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();
}
Sie müssen den Wert des href-Attribut des nehmen Ankerelement mit HtmlAgilityPack der GetAttributeValue Methode. Sie können auf das einzelne Ankerelement zugreifen, indem Sie den Inhalt des übergeordneten Blockcodeelements wie folgt direkt extrahieren:
// div [@ id = 'erster-tweet-wrapper'] / blockquote [@ class = 'twitter-tweet']
Holen Sie dann den einzelnen Link innerhalb. Eine mögliche Lösung könnte so aussehen (in diesem Fall ist die Eingabe facebook , funktioniert aber auch mit 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);
}
Die Ausgabe ist in diesem Fall:
Eine andere Möglichkeit ist, das Ankerelement direkt mit XPath auszuwählen (wie @ har07 vorgeschlagen):
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);
}
Die Ausgabe ist die gleiche wie oben.
Angenommen, Ihre <div>
id ist "first-tweet-wrapper" anstelle von "firt", können Sie diese XPath-Abfrage verwenden, um <a>
element in <blockquote>
:
//div[@id='first-tweet-wrapper']/blockquote/a
Ihr Code sieht also ungefähr so aus:
var a = doc.DocumentNode
.SelectSingleNode("//div[@id='first-tweet-wrapper']/blockquote/a");
if (a != null)
{
var text = a.InnerText;
var link = a.GetAttributeValue("href", "");
}