【问题标题】:Iterating through elements get repeating result on Selenium on Python遍历元素在 Python 上的 Selenium 上获得重复结果
【发布时间】:2018-06-18 04:04:22
【问题描述】:

我遇到了一个难以理解的问题。我有一个带有一堆 li 项目的 ul 列表的 HTML,在这些 li 项目中,它们有我想在 Python 上使用 Selenium 抓取的元素。网站构成如下

<ul id="results">
    <li>
        <div class="name">John</div>
        <div class="age">23</div>
    </li>
    <li>
        <div class="name">Bob</div>
        <div class="age">39</div>
    </li>
    ..... #more li
</ul>

所以这似乎是一个非常简单的问题,我们只需将 li 元素保存为变量,然后遍历每个列表以保存信息。问题是无论我做什么,我的结果总是一遍又一遍地返回第一个列表项。它将遍历正确数量的元素,但始终参考第一个元素。因此,如果我执行以下操作

results = driver.find_elements_by_xpath("""//*[@id="results"]/li""")
for result in results:
    name = result.find_element_by_xpath("""//*[@class="name"]""").text
    print(name)

现在,如果在这种特殊情况下有 10 个 li 元素,则名称“John”将仅打印 10 次,而不是根据迭代列表进行更新。

【问题讨论】:

  • 试试find_element 然后 find_elements。 (注意复数)有一个结果列表和多个名称。还要仔细检查你的 xpath。

标签: python html selenium


【解决方案1】:

您用于第二次搜索的 XPath 不正确。它必须以. 开头。否则,它将从顶部开始搜索。这就是为什么它总是找到第一个项目的原因。请参阅下面的示例。

results = driver.find_elements_by_xpath('//*[@id="results"]/li')
for result in results:
    name = result.find_element_by_xpath('.//*[@class="name"]').text
    print(name)

【讨论】:

  • 就是这个!非常感谢您的帮助。丢失的点就是一切。
  • 所以要澄清“。”会从以前的结果开始搜索,或者它是如何工作的?
  • @RyanN。假设. 是正在处理的当前节点。您的循环将变量result 更改为新的&lt;li&gt;,如果您不以. 开头表达式,则XPath 表达式中的// 将始终从DOM 顶部开始搜索。
  • 明白了。再次非常感谢您的回答和解释。
猜你喜欢
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多