【问题标题】:Selenium partially prints elements texts found and prints null for rest of the elements textSelenium 部分打印找到的元素文本并为其余元素文本打印 null
【发布时间】:2021-12-30 06:20:44
【问题描述】:

我正在为一个个人项目为 Target.com 创建一个网络爬虫,并且已经完成了大部分工作,直到这一部分,这是我坚持的代码。

vinyls = driver.find_elements(By.XPATH, "//li[@data-test='list-entry-product-card']")

for x in vinyls:

    print(x.get_attribute('innerText') + '\n')

它为 3 或 4 个元素打印正确的输出,但随后它对其余元素进行迭代,没有文本输出。 前任: ** Olivia Rodrigo - SOUR(目标独家,乙烯基) 环球音乐集团 仅在 目标 ¬ 4.6 颗星,最多 5 颗星,评分 258 258 24.99 美元 订单满 35 美元即可享受免费标准送货服务 不在普莱诺 检查附近的商店 添加运费 **

然后是其他两个与第一个类似的输出,然后是大约 20 个空输出。奇怪的是它会显示节点在那里,只是没有文本。

感谢任何帮助!

【问题讨论】:

  • 您是否等待所有元素都存在?尝试添加 webdriver 等待。
  • 我在target.com 上没有看到任何文字为 Olivia Rodrigo - SOUR(Target Exclusive,Vinyl),我错过了什么吗?
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: python selenium web-scraping


【解决方案1】:

我猜您无法获取其文本的元素超出了可见的屏幕视口。
为了正确获取它们的文本,您必须滚动到元素,再次获取这些元素,然后提取它们的文本。
像这样的:

wait = WebDriverWait(driver, 20)
actions = ActionChains(driver)
wait.until(EC.visibility_of_element_located((By.XPATH, "//li[@data-test='list-entry-product-card']")))
time.sleep(0.5)

vinyls = driver.find_elements(By.XPATH, "//li[@data-test='list-entry-product-card']")
for idx, vinyl in enumerate(vinyls):
    actions.move_to_element(vinyls[idx]).perform()
    time.sleep(0.5)
    vinyls = driver.find_elements(By.XPATH, "//li[@data-test='list-entry-product-card']")
    print(vinyls[idx].get_attribute('innerText') + '\n')

您将需要这些导入:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time

【讨论】:

    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多