2014-03-21 2 views
3

Я хочу, чтобы иметь возможность получить первую ссылку из этого div.Получить ссылки внутри 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(); 
} 
+0

В отличие от форумов, мы не используем «Спасибо» или «Любая помощь оценена» или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed-from-posts). –

ответ

2

Вы должны принять значение в HREF-атрибута из anchor element использованием HtmlAgilityPack в GetAttributeValue метод. Вы можете получить доступ к один элемент якорный путем извлечения непосредственно содержимого родительского элемента blockcode так:

// ДИВ [@ ид = «первый-твит-обертку»]/BLOCKQUOTE [@ класс = 'twitter- tweet ']

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

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

Выход такой же, как указано выше.

+0

Я получаю исключение NullReferenceException с этим кодом –

+0

Он работает с частью кода HTML из вашего примера. Откуда вы получаете свой ввод? Можете ли вы вставить URL-адрес или полную HTML-страницу? , что ваш вход имеет более одного div с ссылкой в ​​нем. – pasty

+0

Я добавил чек, чтобы избежать пустых результатов. Можете ли вы дать полный код страницы в своем вопросе? – pasty

0

Если предположить, что <div> идентификатор является «первым-твит-обертка» вместо «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", ""); 
} 
+0

Пробовал, но «a» имеет значение –

+1

, учитывая html/xml точно так же, как po sted, это должно работать (проверено). Опубликуйте фактический xml, если вы не тестировали его в этом вопросе. – har07

+0

html, который я опубликовал, является частью этой страницы https://discover.twitter.com/first-tweet#Microsoft. Мне нужно получить ссылку на твит –

Смежные вопросы