【问题标题】:How can I get the "first element X after the element Y" with CSS selectors?如何使用 CSS 选择器获得“元素 Y 之后的第一个元素 X”?
【发布时间】:2015-09-26 18:50:18
【问题描述】:

在一个 Java 应用程序中,想象一下我在一个巨大的 HTML 代码中的某个地方:

<h2>
   <b>
      This
   </b>
</h2>

<h1>
</h1>

假设我想在元素 b 之后获取第一个元素 h1。我通过 JSoup 库尝试了一些 CSS 选择器,但没有发现任何用处。这里最大的问题是:他们不是兄弟姐妹。我不知道b 元素是否是不同父级的子级。

有办法吗?

【问题讨论】:

  • 找一个类,而不是h1,但是逻辑和问题是一样的:stackoverflow.com/questions/1827482/…
  • 您是在尝试将其定位为 js 脚本还是 css 表?
  • 还是不清楚:你用的是什么环境?浏览器? Java 应用程序?什么? JSoup 与浏览器无关。
  • 由于问题中加粗的原因,CSS 不可能。
  • 它是一个 Java 应用程序,但是 Jsoup 有一个使用 CSS 选择器搜索 HTML 文档的方法。

标签: java html css-selectors jsoup


【解决方案1】:

你不能纯粹用 CSS 选择器来做,你必须使用 JSoup 在你的代码中执行一些逻辑。

此算法适用于浏览器以及 JSoup 文档。基本上,从b 元素开始,您可以通过以下方式找到h1

  1. current 设置为b
  2. 虽然current 不是null
    1. sibling 设置为current下一个元素兄弟(在JSoup 中,这将是nextElementSibling method;在任何模糊的现代浏览器中,它是nextElementSibling 属性.
    2. 虽然sibling 不是null
      1. 如果siblingh1,那么您就完成了
      2. 否则,将sibling 设置为sibling 的下一个元素兄弟并继续这个兄弟循环(“while sibling is not null”)
    3. (siblingnull) 将current 设置为current 的父节点。在 JSoup 中,这将是 parent method。在浏览器中,它将是parentNode 属性
    4. 如果current 不是null,则继续这个父循环(“while current is not null”)。
    5. 没有关注h1

【讨论】:

  • 谢谢!但是这个解决方案能找到“侄子”吗?看来,由于我有一个当前元素,所以我只能找到与它相同或高于它的元素,但不能找到任何低于它的元素。
  • @MrGuliarte:这会找到任何以下侄子,是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2011-06-05
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多