JSOUP无法找到项目,:eq似乎被1关闭

时间:2015-01-15 02:20:25

标签: html5 jquery-selectors css-selectors jsoup

我正在尝试使用一个非常具体的jsoup选择器从页面中提取一些数据,但它似乎是a的第一个实例:eq是一个关闭的。例如,对于页面:Example Page

我使用以下选择器来选择文章的标题:

html>body>article:eq(0)>div:eq(0)>header>h1

页面中的html片段如下所示:

Snippet

所以上面的选择器不起作用,但有趣的是这个选择器,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

任何想法?谢谢!

1 个答案:

答案 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