【问题标题】:Extract a certain part of HTML with XPath and HTMLAbilityPack使用 XPath 和 HTMLAbilityPack 提取 HTML 的特定部分
【发布时间】:2013-09-12 01:16:20
【问题描述】:

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

我知道有一行包含视图、标题、ID 等的所有详细信息。

这是我试图从 html 中获取的内容:

这是第 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 能力包作为资源,并开始尝试获取它。 有人能解释一下如何获取所有这些细节以及所涉及的 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);
                }
            }

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

【问题讨论】:

  • 我不明白你想做什么,你能补充更多信息吗?

标签: c# html xpath


【解决方案1】:

您的 xpath 正在选择 &lt;div&gt; 内的 &lt;a&gt; 元素。如果你也想要&lt;div&gt; 的属性,那么你需要要么

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

我希望这已经足够清楚了。祝你好运。

【讨论】:

  • 我不明白。除了 '//a' 之外,我还需要添加什么来获得不同的部分? (我得到了其余的,只是这令人困惑)
【解决方案2】:

似乎给我的答案在挖掘大量之后没有帮助,我终于明白了 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);
            }

我只需要抓取课堂上的内容。知道这一点后使用起来会容易得多。

【讨论】:

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