xPath适用于最后一页,但不适用于第一页-Selenium Java

xPath适用于最后一页,但不适用于第一页-Selenium Java,java,selenium,xpath,web-scraping,Java,Selenium,Xpath,Web Scraping,我想从Java中使用Selenium提取一些数据 问题是xPath/html/body/div[2]/div[1]/form/div[1]/div[5]/div/div[5]/div[“+i+”]/div[2]/p/a在页面上获取每篇文章的标题并单击它们,它在最后一页有效,但在第一页无效,我不明白为什么 driver.findElement(By.xpath("/html/body/div[2]/div[1]/form/div[1]/div[5]/div/div[5]/div[" + i + "

我想从Java中使用Selenium提取一些数据

问题是xPath
/html/body/div[2]/div[1]/form/div[1]/div[5]/div/div[5]/div[“+i+”]/div[2]/p/a
在页面上获取每篇文章的标题并单击它们,它在最后一页有效,但在第一页无效,我不明白为什么

driver.findElement(By.xpath("/html/body/div[2]/div[1]/form/div[1]/div[5]/div/div[5]/div[" + i + "]/div[2]/p/a")).click();
我怀疑这是一个逐个错误,因为XPath的索引从1开始,并且具有
div[0]
将不匹配任何内容

但是,一般来说,表达式非常脆弱,因为它是一个绝对表达式,其路径从HTML树的根开始,一直到通过每个父级的所需元素。任何微小的布局改变都会破坏它

相反,我们可以认真简化表达式:

//div[contains(@class, 'rslt')]/p/a
这将匹配每页所有20个链接

或者,如果您喜欢更简洁的CSS选择器:

driver.findElements(By.cssSelector(".rslt > p > a"));
我怀疑这是一个逐个错误,因为XPath的索引从1开始,并且具有
div[0]
将不匹配任何内容

但是,一般来说,表达式非常脆弱,因为它是一个绝对表达式,其路径从HTML树的根开始,一直到通过每个父级的所需元素。任何微小的布局改变都会破坏它

相反,我们可以认真简化表达式:

//div[contains(@class, 'rslt')]/p/a
这将匹配每页所有20个链接

或者,如果您喜欢更简洁的CSS选择器:

driver.findElements(By.cssSelector(".rslt > p > a"));

谢谢你,我现在就试试,如果有用的话就告诉你。但问题是xPath更方便,因为这样我就可以在两者之间放置一个变量,并在页面上循环它。否则,我如何单击每个链接并检查内容并返回?嗯,我能得到链接,虽然我刚刚想到了。@AndréYuhai是的,我理解你的困惑。您可以使用
findelelements
查找多个元素,然后逐个循环并单击。或者,首先使用
getAttribute()
收集
href
值,然后访问它们。是的,这就是我现在所做的。将链接放入列表中,然后在列表中循环。顺便问一下,我们可以为cssSelector做一些类似“.class1.class2>h1”的事情吗?@AndréYuhai是的,这是一个有效的CSS选择器。我想用我给你展示的选择器选择h1标记,但这也会引发一个错误。谢谢你,我现在就试试,如果有用的话就告诉你。但问题是xPath更方便,因为这样我就可以在两者之间放置一个变量,并在页面上循环它。否则,我如何单击每个链接并检查内容并返回?嗯,我能得到链接,虽然我刚刚想到了。@AndréYuhai是的,我理解你的困惑。您可以使用
findelelements
查找多个元素,然后逐个循环并单击。或者,首先使用
getAttribute()
收集
href
值,然后访问它们。是的,这就是我现在所做的。将链接放入列表中,然后在列表中循环。顺便问一下,我们可以为cssSelector做一些类似“.class1.class2>h1”的事情吗?@AndréYuhai是的,这是一个有效的CSS选择器。我想用我给你展示的选择器选择h1标记,但这也会引发一个错误。