【问题标题】:How to extract links, text and timestamp from webpage via Html Agility Pack如何通过 Html Agility Pack 从网页中提取链接、文本和时间戳
【发布时间】:2012-01-23 12:18:32
【问题描述】:

我正在使用 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>

但在尝试提取链接和链接文本时,上述内容是最独特的工作内容。

这是我希望看到的结果

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

跟随每个链接。并且根据上面的输出循环内的每个链接都有输出吗?感谢您在这方面的任何帮助。

【问题讨论】:

  • 我现在已经设法得到正确的语法,以便从上述示例中选择链接:使用以下代码:var linksOnPage = from lnks in document.DocumentNode.SelectNodes("//span [@class='Subject2']//a") 这可以很好地选择带有 url 和文本的链接,但是我该如何获取时间戳呢?也就是说,从每个链接后面选择时间戳:2012-01-20 09:35。并且根据上面的输出循环内的每个链接都有输出吗?感谢您在这方面的任何帮助。
  • 以后,您可以编辑问题以添加或更改信息,让人们知道问题已更改。这次我已经为您完成了,但是您可以清理您的问题以帮助鼓励人们回答:)
  • 好的谢谢不知道。以后会做的。
  • @lars,您的 HTML 代码示例格式错误;见&lt;span&gt;&lt;a&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;
  • 我知道。它是原始网页的形状,我必须忍受和处理!

标签: html-agility-pack


【解决方案1】:

您的 HTML 示例格式不正确,这就是您得到意外结果的原因。

要找到您的第一个和第二个值,您必须在&lt;span class='Subject2'&gt; 中获取&lt;a&gt; - 第一个值是href 属性值,第二个是锚点的InnerText。要获得第三个值,您必须获得 &lt;span class='Subject2'&gt; 标记的以下同级并获得其 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>

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多