Как получить доступ к большему количеству тегов в одном методе, используя htmlagilitypack в c #? - PullRequest
0 голосов
/ 05 января 2012

Я разрабатываю программу для сканирования веб-страницы thenextweb.com по ее сообщениям (ссылкам, содержимому публикации, изображению, дате, автору и т. Д.)

HTML для его одного поста выглядит так:

<div class="media-data">

                     <h4><a href="http://thenextweb.com/mobile/2012/01/05/nokia-reportedly-to-appoint-f-secure-founder-risto-siilasmaa-as-new-chairman/">Nokia to Name Risto Siilasmaa as New Chairman</a></h4>
                     <p class="article-meta"><a href="http://thenextweb.com/mobile/">TNW Mobile</a> &#8226; <a href="http://thenextweb.com/author/matt/" title="Posts by Matt Brian" rel="author">Matt Brian</a>  &#8226; <span class="date" title="1325748846">January 5, 2012</span></a></p>

                     <p>Nokia is reportedly planning to nominate and name Risto Siilasmaa, founder of Finnish anti-virus and computer security F-Secure, as its new chairman by the end of the month, Finland&#8217;s Helsingin Sanomat reports&#8230;</p>
                 </div>

Это HTML для следующих 15 сообщений на домашней странице. Для доступа к его содержанию я использовал:

  var webGet = new HtmlWeb();
  var document = webGet.Load(url);
 var infos = from info in document.DocumentNode.SelectNodes("//div[@class ='media-data']//h4//a")
                        select new
                        {
                            LinkURL = info.Attributes["href"].Value,
                            Text = info.InnerText
                        };

            lvLinks.DataSource = infos;
            lvLinks.DataBind();

и для доступа к информации об авторах, дате и т. Д. Я использовал:

 var infos = from info in document.DocumentNode.SelectNodes("//div[@class ='media-data']//p[@rel = 'author']")
                        select new
                        {
                           Author = info.InnerText
                        };

            lvLinks.DataSource = infos;
            lvLinks.DataBind();

Я использовал управление списком для отображения данных на странице ASP как <li> <%# Eval("Text") %> - <%# Eval("LinkUrl") %> </li>

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

Может ли быть способ, чтобы я мог записывать и извлекать информацию в тегах <div class="media-data">... </div> для любого нужного мне узла и сохранять его?

Пожалуйста, предложите это, так как очень важно приложить авторов, информацию о дате с самой ссылкой на пост. Я не могу этого сделать.

Спасибо

1 Ответ

0 голосов
/ 13 марта 2012

Вы можете сначала выбрать узлы типа <div class="media-data">, а затем выбрать все необходимые подузлы внутри него:

var nodes = doc.DocumentNode.SelectNodes("//div[@class ='media-data']")
    .Select(div => new
    {
        Link = div.SelectSingleNode("h4/a"),
        Author = div.SelectSingleNode("//*[@rel='author']"),
        Date = div.SelectSingleNode("//*[@class='date']"),
        Content = div.SelectSingleNode("p[last()]")
    }).Select(data => new
    {
        LinkURL = data.Link.Attributes["href"].Value,
        Text = data.Link.InnerText,
        Author = data.Author.InnerText,
        Date = DateTime.Parse(data.Date.InnerText),
        Content = data.Content.InnerHtml
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...