Selenium Python 脚本只抓取部分可见信息

Selenium Python script only scrapes part of the visible information

很抱歉标题能更好地描述您访问以下网站时遇到的问题:

右边有一条文字,上面写着“查看全部”。一旦你点击它,就会弹出一个 link 列表到各种分支。我正在尝试为那些叉子刮 hyperlinks。

一个问题是,刮刀不仅会刮掉前叉的 link,还会刮掉型材的 link。对于那些 link,他们不使用特定的 class 或 ID。所以我编辑了我的脚本来计算哪个结果是正确的,哪个不是。那部分有效。然而,该脚本只抓取了一些 links 而不会抓取其他内容。这让我感到困惑,因为起初我认为这是由于元素对硒不可见造成的,因为存在滚动。这似乎不是问题,因为其他未被抓取的 links 通常是可见的。该脚本仅抓取前 5 link 秒并完全跳过其余部分。

我现在不确定该怎么做,因为没有关于代码本身任何可能问题的错误或警告。

这是抓取 link 的代码的一小部分。

driver.get(url)

wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "button.see-all-forks"))).click()
fork_count = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "span.jsx-3602798114"))).text
forks = wait.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR, "a.jsx-2470659356")))
j = 1
for i, fork in enumerate(forks):
    if j == 1:
        forks[i] = fork.get_attribute("href")
        print(forks[i])
    if j == 3:
        j = 1
    else:
        j += 1

在这种情况下,“url”变量是我在上面提供的 link。然后循环在每个结果后跳过 3 个结果,因为每第 4 个结果都是正确的。我尝试使用 XPath 使用“包含”功能过滤出结果,但是名称因用户自己命名而有所不同,因此据我所知,这是过滤出结果的唯一方法。

这是我得到的输出。

此后没有任何结果被打印出来,程序被终止而没有错误。这里发生了什么,我错过了什么?我很困惑为什么 Selenium 在终止后只抓取五个结果。

编辑注释 - 我的代码解释:

我已经设置了 if 语句来检查每 4 个结果,因为它是正确的,但第一个也是正确的。 If "j!=3" then add 1 to "j" once "j=3" (now appears the result) the code if "j=1" is 运行 and the right result is printed.所以正确的结果永远是"j=1".

这里的问题是,一旦出现至少一个元素,您在这里使用的所有预期条件都会通过。
所以

forks = wait.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR, "a.jsx-2470659356")))

没有像字面意思那样捕获所有元素.. 你永远不知道有多少,但至少有一个。
这就是为什么您的 forks 列表如此短。
克服这个问题的最简单方法是在 wait.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR, "a.jsx-2470659356"))) 之后添加一些硬编码睡眠,并且仅在此之后才能获取元素列表。
有关详细信息,请参阅 post。

在Java中有一个预期条件numberOfElementsToBeMoreThan,因此可以在此处使用条件大于95等,但在Python中预期条件列表是更短而且没有这样的选项....