【问题标题】:CsQuery to parse a collection of li itemsCsQuery 解析 li 项的集合
【发布时间】:2013-03-31 01:52:26
【问题描述】:

这是我的代码:

CQ dom = CQ.Create(htmlString);
var items = dom[".blog-accordion li"];

foreach (var li in items)
{
    var newTournament = false;
    var test = li["header h2"];
}

在 foreach 循环中 li 变成了一个 IDomObject 变量,我无法再深入研究它。

有什么建议吗?这是我要解析的示例 HTML:

<ul>
  <li>
    <header>
      <h2>Test</h2>
    </header>
  </li>
  <li>
    <header>
      <h2>Test 2</h2>
    </header>
  </li>
  <li>
    <header>
      <h2>Test 3</h2>
    </header>
  </li>
</ul>

我需要抓取每个 h2 元素的文本。

【问题讨论】:

    标签: c# html web-scraping csquery


    【解决方案1】:

    这样做是为了使CsQuery 与行为相同的jQuery 保持一致。您可以通过调用.Cq() 方法将其转换回CQ 对象

    foreach (var li in items)
    {
        var newTournament = false;
        var test = li.Cq().Find("header h2");
    }
    

    或者,如果您想要更多 jQueryish 语法,也可以使用以下方法:

    foreach (var li in items)
    {
        var newTournament = false;
        var test = CQ.Create(li)["header h2"];
    }
    

    如果您愿意,可以将您的代码重构为以下内容:

    var texts = CQ.Create(htmlString)[".blog-accordion li header h2"]
                  .Select(x=>x.Cq().Text());
    

    【讨论】:

    • crikey 我刚刚编辑了你的答案两次,因为我不记得 Create() 绑定到一个新的 dom。这就是一个星期对我的旧大脑造成的影响。 Cq() 从其参数创建一个选择集,但仍绑定到同一个 DOM,因此您需要使用 Find 在其中搜索,而 [..] 将选择原始 DOM。 Create 总是从它的参数中创建一个新的 dom。
    • 谢谢 :) 很高兴看到您重新站起来响应 ping。 @Serg 如果您不知道,Jamie 是创建并正在开发 CsQuery 的人。
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2010-10-27
    相关资源
    最近更新 更多