【问题标题】:Cannot get content of specific div with html agility pack无法使用 html 敏捷包获取特定 div 的内容
【发布时间】:2016-07-02 12:43:43
【问题描述】:

我正在使用 html 敏捷包从网站获取一些数据,现在出现了一点问题。我想从这个 div 中获取一些数据:

<div class="container middle">
<div class="details clearfix">
  <dl>
    <dt>Gara</dt>
    <dd><a href="/national/china-pr/csl/2016/regular-season/r34227/">Super League</a></dd>

    <dt>Data</dt>
    <dd><a href="/matches/2016/07/02/"><span class='timestamp' data-value='1467459300' data-format='d mmmm yyyy'>2 luglio 2016</span></a></dd>

    <dt>Game week</dt>
    <dd>15</dd>

    <dt>calcio di inizio</dt>
    <dd>
      <span class='timestamp' data-value='1467459300' data-format='HH:MM'>13:35</span>
      (<span class="game-minute">FP'</span>)
    </dd>
  </dl>
</div>

问题是container middledetails clearfix 类有两个div,我只想获取上面粘贴的特定div 的内容。这个 div 每个标签都有一个 dl 标签。

这是我的代码:

var url = "http://it.soccerway.com/matches/2016/07/02/china-pr/csl/henan-jianye/beijing-guoan-football-club/2207361/";

var doc = new HtmlDocument();
doc.LoadHtml(new WebClient().DownloadString(url));
var infoDiv = doc.DocumentNode.SelectSingleNode("//div[@class='block_match_info real-content clearfix ']");
var matchDetails = infoDiv.SelectSingleNode("//div[@class='container middle']");

这会返回错误的结果,尤其是这样:

<div class="container middle">
<h3 class="thick scoretime score-orange">
  0 - 0
</h3>

这是完整的source 代码。

【问题讨论】:

  • 你到底想得到什么?
    ? 的内部 HTML
  • 查看您的代码和完整的源代码,我想说,您得到的正是您想要的。等等...我刚刚看到有两个&lt;div class="container middle"&gt;。你想得到第二个div,对吗?
  • @spirit,是的,我也对如何获取此特定内容感兴趣:&lt;dt&gt;calcio di inizio&lt;/dt&gt; &lt;dd&gt; &lt;span class='timestamp' data-value='1467459300' data-format='HH:MM'&gt;13:35&lt;/span&gt; (&lt;span class="game-minute"&gt;FP'&lt;/span&gt;) &lt;/dd&gt;
  • 您使用HtmlDocument 类的哪个程序集? System.Windows.Forms?
  • 好的。我去看看。

标签: c# regex html-agility-pack


【解决方案1】:

好吧,对于这个特定的网页,您可以执行以下操作:

        var matchDetails = infoDiv.SelectNodes(".//div[@class='container middle']");
        Console.WriteLine(matchDetails[1].InnerHtml);

并通过matchDetails[1]HtmlNode 合作。要检索其他数据,您可以使用类似的 xpath 请求,例如:

    var infoDiv = doc.DocumentNode.SelectSingleNode("//div[@class='block_match_info real-content clearfix ']");
    var matchDetails = infoDiv.SelectNodes(".//div[@class='container middle']");
    var dl = matchDetails[1].SelectSingleNode(".//dl");
    var dt = dl.SelectNodes(".//dt");
    var dd = dl.SelectNodes(".//dd");
    for (int i = 0; i < dt.Count; i++) {
        var name = dt[i].InnerHtml;
        var value = dd[i].InnerHtml;
        Console.WriteLine(name + ": " + value);
    }

当然,您需要检查NullReference 之类的东西

【讨论】:

  • 可以选择容器中间的所有dt标签吗?
  • 是的,var dt = dl.SelectNodes(".//dt"); 这是所有&lt;dt&gt; 标签的选择
【解决方案2】:

使用类details clearfix 查询div 应返回目标div 元素。但是,您需要注意一个关键细节, 需要 ./ 之前使 XPath 相对于 infoDiv 引用的上下文元素,否则 XPath 将在根文档上下文中进行评估(就像在 doc.DocumentNode 而不是在infoDiv) :

var infoDiv = doc.DocumentNode.SelectSingleNode("//div[@class='block_match_info real-content clearfix ']");
var matchDetails = infoDiv.SelectSingleNode(".//div[@class='details clearfix']");

【讨论】:

  • 修正了我的答案,tnx。
猜你喜欢
相关资源
最近更新 更多
热门标签