使用XPath和HTMLAbilityPack提取HTML的某个部分

时间:2013-09-08 11:32:34

标签: c# html xpath

我遇到了XPath语法的问题,因为我不明白如何使用它来提取某些HTML语句。 我正在尝试从频道页面加载视频信息; http://www.youtube.com/user/CinemaSins/videos

我知道有一行可以保存视图,标题,ID等所有细节。

以下是我想从html中获取的内容: enter image description here

这是第2836行;

<div class="yt-lockup clearfix  yt-lockup-video yt-lockup-grid context-data-item" data-context-item-id="ntgNB3Mb08Y" data-context-item-views="243,456 views" data-context-item-time="9:01" data-context-item-type="video" data-context-item-user="CinemaSins" data-context-item-title="Everything Wrong With The Chronicles Of Riddick In 8 Minutes Or Less">

我不确定如何,但我已将HTML Ability Pack添加为资源并已开始尝试获取它。 有人可以解释如何获取所有这些细节和XPath语法吗?

我所尝试的内容:

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='yt-lockup clearfix  yt-lockup-video yt-lockup-grid context-data-item']//a"))
            {
                if (node.ChildNodes[0].InnerHtml != String.Empty)
                {
                    title.Add(node.ChildNodes[0].InnerHtml);
                }
            }

^上述代码仅用于获取每个视频的标题。但它也有空白输入。代码已执行,结果如下。

enter image description here

2 个答案:

答案 0 :(得分:1)

您的xpath正在<a>中选择<div>元素。如果你也需要<div>的属性,那么你需要

a)选择两个元素并分别处理它们。 b)运行几个xpath查询,在其中指定所需的确切属性。

让我们在这个例子中使用(a)。

var nodes = doc.DocumentNode.SelectNodes("//div[@class='yt-lockup clearfix  yt-lockup-video yt-lockup-grid context-data-item']");

并获取属性和标题,如下所示:

foreach(var node in nodes)
{
  foreach(var attribute in node.Attributes)
  {
    // ... Get the values of the attributes here.
  }

  var linkNodes = node.SelectNodes("//a"));
  // ... Get the InnerHtml as per your own example.
}

我希望这很清楚。祝你好运。

答案 1 :(得分:1)

似乎给我的答案没有帮助,所以在挖掘HEAPS之后,我终于明白了XPath是如何运作的,并设法自己完成,如下所示;

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='yt-lockup clearfix  yt-lockup-video yt-lockup-grid context-data-item']"))
            {
                String val = node.Attributes["data-context-item-id"].Value;
                videoid.Add(val);
            }

我只需抓住课堂内容。知道这一点使它更容易使用。