我该如何在JSOUP中选择这个元素?

27

这是HTML结构:

在此输入图像描述

Element link = doc.select("div.subtabs p").first();

那似乎不起作用。我怎么选择那个 p 元素?


11
+1 - 很清晰的问题。 - jamesmortensen
17
俗话说得好,“一张HTML页面源代码截图,配上涂鸦笔迹指出需要选择的元素,胜过千言万语”。 - Rob Kielty
2
@Rob 我记得原话是拉丁文。 - Hauke Ingmar Schmidt
6个回答

26

class="subtabs" 的 DIV 实际上不是 p 元素的父元素,而是 p 的兄弟元素。要获取 p,你需要先获取具有 id="content" 的父 DIV 的引用:

Element link = doc.select("div#content > p").first();
此外,您需要使用>符号来指示您选择的是div#content的子元素。

parent > child:直接从父元素传承下来的子元素,例如div.content > p找到p元素;body > *找到body标签的直接子元素

如果在未来使用JSOUP CSS选择器时遇到困难,请查看JSOUP Selector Syntax cookbook,其中有一些很好的示例和解释。

谢谢,如果在表单标签中有另一个<p>标签,这个查询会到达那个<p>标签吗? - HackToHell
说实话,我不是100%确定,但很容易快速添加一个并查看发生了什么。我怀疑.first()可能会确保您只获取p的第一个实例,但尝试它是确定的最好方法 :) 要注意的一件事是,如果选择集合,则需要使用带有"s"的Elements而不仅仅是Element。希望这可以帮助! - jamesmortensen
1
根据此示例中的上下文和我们知道 Element 是单个实体而不是集合这一事实,我猜只会返回一个 p。http://jsoup.org/cookbook/extracting-data/selector-syntax. 如果您的 p 不是第一个(或唯一一个),则必须采用不同的方法。 - jamesmortensen
好的,那么我遍历元素。 - HackToHell
没错。或者是:eq(n),表示兄弟节点索引等于n的元素。请查看链接,即食谱链接。 Jsoup是一个非常好的工具,如果您经常使用jQuery,它可以帮助使过渡更加平稳。祝好运! :) - jamesmortensen
"#content > p" 将匹配所有直接作为 #content 子元素的 p,但不包括孙子、曾孙等后代,只匹配第一层子元素。这就是 > 与 "#content p" 不同的地方,后者将匹配 #content 的所有 p 后代。 - mvmn

4
下的

元素不是 .subtabs 的子元素。


+1 - 在这种情况下省略>也是正确的:E F --> 一个从 E 元素继承而来的 F 元素 - jamesmortensen
最佳选择器高度依赖于其余HTML结构的稳定性。我的建议只是解决了当前的问题。从我们在截图中看到的情况来看,最好假设.subtabs内部有p元素,并使用>符号。 - Hauke Ingmar Schmidt
我认为这很好。我们不在这里解决所有操作员的问题,但是在我看来,只需要提供足够的帮助:a)帮助他/她理解至少一个可能解决即时问题的解决方案,b)希望提供足够的指导,以便如果所述答案不能完全解决问题,他/她可以轻松地自行解决。如果你真的 真的 想要彻底,你可以将你告诉我的内容作为你答案的附加点。 :) - jamesmortensen

1

Chrome浏览器的SelectorGadget在构建CSS选择器方面非常有帮助,只需点一下即可。当我尝试定位特定字段时,它为我节省了许多开发时间。


1
你正在尝试提取的p标签不是div的子元素,而是同级元素。父级
的id为content,你想要的p标签是其父级中的第一个p标签。因此,请使用doc.select("div#content > p").first(); #表示id,>表示RHS是LHS的子元素。因此,该语句的意思是获取作为子元素具有id为content
的第一个段落。

1
它会查找紧随兄弟元素之后的元素。代码为:

Element link = doc.select("div.subtabs + p")


0

试试这个:

Element link = doc.select("div.subtabs > p").first();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接