【问题标题】:XPath expression to Select all labels not nested within a UL tagXPath 表达式选择所有未嵌套在 UL 标记中的标签
【发布时间】:2014-03-18 17:51:32
【问题描述】:

我有一个关于 XPath 表达式的简单问题要问,我的 HTML 看起来像这样。我只想选择作为 DT 子标签的标签。

<div class="product-options" id="product-options-wrapper">
<dl class="last">
<dt>
<ul>
<label class="required">Available Grip Sizes<em>*</em></label>
</ul>
<div><label>other label</label></div>
</dt> 

<dt>
<label>Would you like this racket restrung?</label>
</dt>

<dt>
<label>String Tension</label>
</dt>
</dl>
</div>

My XPath expression: .//div[@id='product-options-wrapper']//dt/label"

我确实尝试使用 [not(@class)] 表达式,该表达式在这种特定情况下会起作用,但是我不能在我的项目中使用它,因为我在多个文档上使用相同的 xpath。

所以我希望我的查询是......选择所有标签,除了不是 UL 的孩子/嵌套在 UL 中

非常感谢你

另外,任何人都可以参考一个好的网站来更深入地学习 XPath 查询/表达式吗?

【问题讨论】:

  • all except not a child是否意味着all children

标签: c# html xpath


【解决方案1】:

如果 'all except not a child of ul' 表示 'all which are children of ul' 那么 XPath 看起来像

//div[@id='product-options-wrapper']//dt/ul//label

使用 HtmlAgilityPack 获取这些标签看起来像

HtmlDocument doc = new HtmlDocument();
doc.Load(path_to_html_file);
string xpath = "//div[@id='product-options-wrapper']//dt/ul//label";
var labels = doc.DocumentNode.SelectNodes(xpath);

结果是

<label class="required">Available Grip Sizes<em>*</em></label>

更新:在你完全改变问题后,解决方案将是(实际上你有正确的 XPath 来满足这个要求)

//div[@id='product-options-wrapper']//dt/label

结果是

<label>Would you like this racket restrung?</label>
<label>String Tension</label>

【讨论】:

  • 嗨 Sergev,对不起,我不得不编辑我的原始帖子。我只想选择作为 DT 标签的直接子标签的标签,所以在我的场景中我只想选择两个标签。
  • @user3091209 好的,更新了答案。实际上现在还不清楚您的查询有什么问题
  • 嗨 Sergev,再次对糟糕的描述感到抱歉,我真正想做的是选择所有标签,它们是 DT 的直接子元素,其中兄弟元素
    不包含
      标签。所以在这种情况下,只选择了两个标签。
  • @user3091209 您对您的意图的描述极差。我会稍等片刻,以确保您的最后一个要求不会改变
  • 抱歉 Sergev,我相信我的最后一条评论是我希望实现的。谢谢你对我的包容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
相关资源
最近更新 更多