我正在尝试使用一个非常具体的jsoup选择器从页面中提取一些数据,但它似乎是a的第一个实例:eq是一个关闭的。例如,对于页面:Example Page
我使用以下选择器来选择文章的标题:
html>body>article:eq(0)>div:eq(0)>header>h1
页面中的html片段如下所示:
所以上面的选择器不起作用,但有趣的是这个选择器,eq的第一次出现使其索引碰到了一个。
html>body>article:eq(1)>div:eq(0)>header>h1
我使用的代码是:
Document doc = null;
try {
doc = Jsoup.connect( "http://antonioleiva.com/material-design-everywhere/" )
.userAgent("Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36")
.get();
Element ele = doc.select(toast).first();
if(ele != null){
System.out.println(ele.text());
}
} catch ( IOException e ) {
e.printStackTrace();
}
我也确认发生了同样的事情:Try Jsoup Online
任何想法?谢谢!
答案 0 :(得分:2)
:lt()
,:gt()
和:eq()
等非标准选择器,jsoup's selector documentation也非常稀疏。这些例子也不是很有帮助:
:lt(n)
个兄弟索引小于 n 的元素td:lt(3)
找到每行的前2个单元格后
:gt(n)
元素,其兄弟索引大于 n
跳过前两个td:gt(1)
找到单元格的元素
:eq(n)
个兄弟索引等于 n
根据所做的一点,但是,我的猜测是jsoup的版本:lt()
,:gt()
和:eq()
只不过是零 - :nth-child()
的索引版本,表示article:eq(0)
在功能上等同于article:nth-child(1)
,article:eq(1)
到article:nth-child(2)
。
这与他们的jQuery对手which behave completely differently from :nth-child()
非常不同。如果有的话,那些jsoup似乎完全是多余的,更不用说那些熟悉jQuery选择器的人不必要地混淆了。
但是再一次,这些选择器中没有一个是开始时的标准的一部分,所以虽然jsoup的文档本来可以更清楚,但是它不是错误的来实现它们不同于jQuery(虽然我仍然不得不质疑他们为什么一开始就难以实现它们)。这就是为什么我要避免像瘟疫这样的非标准选择者,除非绝对没有其他选择。
由于这些选择器不执行任何操作:nth-child()
在jsoup中无法做到,所以最好使用标准选择器:
html>body>article:nth-child(2)>div:nth-child(1)>header>h1