Selenium find_elements(By.CLASS_NAME) 部分工作但需要完全工作

问题描述 投票:0回答:2

所以我用 selenium 做了一些网络抓取,我找到了我想要定位的元素的类。好吧,问题是它的作用很小。我的意思是,调用不会返回页面上具有此类的每个元素,但会返回一些。

 driver.find_elements(By.CLASS_NAME,"_3sf33-9rVAO_v4y0pIW_CH")

这只返回一些具有相同类名的元素,而不是所有元素。

This is a screenshot of what I believe causes the error

上面的标签显示了调用找到的最后一个标签,下面的标签是不再找到它们的地方。

所有的div都具有相同的结构,直到突出显示的div,然后它们更改为突出显示的div的结构。

如您所见,它们都有相同的类,所以我不确定是什么导致了这种情况发生。

我认为这是导致错误的原因,因为 div 标题更改了关键字列出的顺序。这仍然没有意义,因为无论是否找到,单词的顺序如何改变?

我也尝试过,因为这是对类似问题的回答。

elements = WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "_3sf33-9rVAO_v4y0pIW_CH")))

这让我相信它与页面加载无关,而是改变了顺序。

另外,如果我的术语或措辞不正确,我很抱歉,老实说,我不确定如何描述这些东西。

这是最小的可重现示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = ChromeOptions()
driver = webdriver.Chrome(options=options)

driver.get('https://www.reddit.com/r/AskReddit/comments/11vps60/what_do_you_consider_a_holy_trinity/')

elements = driver.find_elements(By.CLASS_NAME,"_3sf33-9rVAO_v4y0pIW_CH")

print(len(elements))
#currently can only get 37 but should produce a number greater than a 100 or preferably ever element on the page that matches this class 
                

链接在代码中,它在评论“记住:你击败遭遇战的速度越快,你减轻的伤害就越大,所以眩光法师只是一个先发制人的治疗师”。

html selenium-webdriver web-scraping selenium-chromedriver getelementsbyclassname
2个回答
0
投票

这里的问题是所有评论都需要一段时间才能在页面加载后加载。有某种后台进程会继续加载元素。我写了一个简单的方法,它只是等到评论数稳定下来,然后返回元素集合。

def wait_for_comments(locator)
    num_comments = 0
    while (True)
        e = driver.find_elements(locator)
        if len(e) == num_comments:
            return e
        else:
            num_comments = len(e)
        time.sleep(.5)

然后你的脚本看起来像

comments = wait_for_comments((By.CSS_SELECTOR, "._3sf33-9rVAO_v4y0pIW_CH"))
print(len(comments))

-1
投票

你有没有给网络驱动程序一个延迟,以便加载所有网页组件?

© www.soinside.com 2019 - 2024. All rights reserved.