【问题标题】:xPath is working for the last page but not the first - Selenium JavaxPath 适用于最后一页但不是第一页 - Selenium Java
【发布时间】:2018-12-15 03:15:50
【问题描述】:

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

问题是 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();

【问题讨论】:

    标签: java selenium xpath web-scraping


    【解决方案1】:

    我怀疑这是一个逐一错误,因为 XPath 的索引从 1 开始,而 div[0] 则不会匹配任何内容。

    不过,您的表达式通常非常脆弱,因为它是一个绝对表达式,其路径从 HTML 树的最根开始,一直到所需的元素,经过每个父节点。任何细微的布局更改都会破坏它。

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

    //div[contains(@class, 'rslt')]/p/a
    

    这将匹配每页的所有 20 个链接。

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

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

    【讨论】:

    • 谢谢你,我现在试试这个,如果它有效,请告诉你。但问题是 xPath 这样更方便,因为我可以简单地在两者之间放置一个变量并在页面上循环它。否则我怎么能点击每个链接并检查内容并导航回来?好吧,虽然我只是想到了链接,但我可以得到链接。
    • @AndréYuhai 是的,我理解你的困惑。您可以使用findElements 查找多个元素,然后逐个遍历它们并单击。或者,首先用getAttribute() 收集href 值,然后再访问它们。
    • 是的,这就是我现在所做的。将链接放入列表中,然后遍历列表。顺便说一句,我们可以为 cssSelector 做类似“.class1 .class2 > h1”的事情吗?
    • @AndréYuhai 是的,这是一个有效的 CSS 选择器。
    • 我想使用我向您展示的选择器选择那个 h1 标记,但这也会引发错误。 prntscr.com/lv6yvk
    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多