Как извлечь ссылки, текст и метку времени с веб-страницы с помощью Html Agility Pack - PullRequest
0 голосов
/ 23 января 2012

Я использую Html Agility Pack и пытаюсь извлечь ссылки и текст ссылки из следующего HTML-кода.Веб-страница извлекается с удаленной страницы и сохраняется локально в целом.Затем с этой локальной веб-страницы я пытаюсь извлечь ссылки и текст ссылки.Естественно, что на веб-странице есть другой HTML-код, такой как текст других ссылок и т. Д. Внутри ее страницы, но для ясности он здесь удален.

<span class="Subject2"><a href="/some/today.nsf/0/EC8A39D274864X5BC125798B0029E305?open">
Description 1 text here</span> <span class="time">2012-01-20 08:35</span></a><br>
<span class="Subject2"><a href="/some/today.nsf/0/EC8A39XXXX264X5BC125798B0029E312?open">
Description 2 text here</span> <span class="time">2012-01-20 09:35</span></a><br>

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

Это то, что я хотел бы видеть в результате

<link>/some/today.nsf/0/EC8A39D274864X5BC125798B0029E305</link>
<title>Description 1 text here</title>
<pubDate>Wed, 20 Jan 2012 07:35:00 +0100</pubDate>

<link>/some/today.nsf/0/ EC8A39XXXX264X5BC125798B0029E312</link>
<title>Description 2 text here</title>
<pubDate> Wed, 20 Jan 2012 08:35:00 +0100</pubDate>

Это мой код:

var linksOnPage = from lnks in document.DocumentNode.SelectNodes("//span[starts-with(@class, 'Subject2')]")

(lnks.Name == "a" &&
lnks.Attributes["href"] != null &&
lnks.InnerText.Trim().Length > 0)

select new
{
Url = lnks.Attributes["href"].Value,
Text = lnks.InnerText
Time = lnks. Attributes["time"].Value
};

    foreach (var link in linksOnPage)
        {
            // Loop through.
            Response.Write("<link>" + link.Url + "</link>");
      Response.Write("<title>" + link.Text + "</title>");
      Response.Write("<pubDate>" + link.Time + "</pubDate>");
        }

И он не работает, я получаюничего.

Так что любые предложения и помощь будут высоко оценены.

Заранее спасибо.

Обновление: Мне удалось получить правильный синтаксисТеперь, чтобы выбрать ссылки из приведенных выше примеров: С помощью следующего кода:

var linksOnPage = from lnks in document.DocumentNode.SelectNodes("//span[@class='Subject2']//a")

Это выбирает ссылки красиво с URL и текстом, но как мне получить также отметку времени?

То есть выберите из этого отметку времени:

<span class="time">2012-01-20 09:35</span></a>

, которая следует за каждой ссылкой.И есть ли этот выход с каждой ссылкой внутри выходного цикла в соответствии с вышеизложенным?Спасибо за любую помощь в этом.

1 Ответ

0 голосов
/ 24 января 2012

Ваш пример HTML имеет неправильный формат, поэтому вы получите неожиданные результаты.

Чтобы найти первое и второе значения, вам нужно получить <a> внутри вашего <span class='Subject2'> - первое значение - этоhref значение атрибута, второе - InnerText привязки.Чтобы получить третье значение, вам нужно получить следующую сестру тега <span class='Subject2'> и получить его InnerText.

Вот как вы можете это сделать:

var nodes = document.DocumentNode.SelectNodes("//span[@class='Subject2']//a");
foreach (var node in nodes)
{
    if (node.Attributes["href"] != null)
    {
        var link = new XElement("link", node.Attributes["href"].Value);
        var description = new XElement("description", node.InnerText);
        var timeNode = node.SelectSingleNode(
                         "..//following-sibling::span[@class='time']");
        if (timeNode != null)
        {
            var time = new XElement("pubDate", timeNode.InnerText);
            Response.Write(link);
            Response.Write(description);
            Response.Write(time);
        }
    }
}

это выводит что-то вроде:

<link>/some/today.nsf/0/EC8A39D274864X5BC125798B0029E305?open</link>
<description>Description 1 text here</description>
<pubDate>2012-01-20 08:35</pubDate>
<link>/some/today.nsf/0/EC8A39XXXX264X5BC125798B0029E312?open</link>
<description>Description 2 text here</description>
<pubDate>2012-01-20 09:35</pubDate>
...