gpt4 book ai didi

javascript - 在 Selenium 中滚动 webelement 后,值意外附加到列表

转载 作者:行者123 更新时间:2023-12-02 22:10:09 25 4
gpt4 key购买 nike

我是Python新手(而且,一般来说,编程),我想从使用Selenium滚动后动态更新的Web元素中抓取数据,类似于这篇文章:Trying to use Python and Selenium to scroll and scrape a webpage iteratively 。与该问题中看到的屏幕截图类似,我的网络元素是一个带有标题的数据表,可能有水平或垂直滚动​​条。

我想做的第一件事是滚动我的网络元素(一次一列,以免跳过任何列)并抓取所有标题。到目前为止,我可以确认我的 webelement 的水平滚动条具有正确的 xpath,并且我能够一次在 webelement 上水平滚动一列。请参阅下面的我的代码,这是我根据这个问题 Python Selenium - Adjust pause_time to scroll down in infinite page 调整的代码:

scraped_headers = []
headers = driver.find_elements_by_xpath("//div[@class='gbData']")
for header in headers:
if header not in scraped_headers:
scraped_headers.append(header)
print(header.text)
last_header = scraped_headers[-1]

width_scrollbar = driver.find_element_by_xpath("""/html/body/div[5]/div[2]/div/div/div/div/div[4]/div[5]/div[2]/div[3]""")

while True:
driver.execute_script("arguments[0].scrollLeft += 50;", width_scrollbar)
time.sleep(.5)
new_header = driver.find_elements_by_xpath("//div[@class='gbData']")[-1]
if new_header.text == last_header.text:
break
headers = driver.find_elements_by_xpath("//div[@class='gbData']")
for header in headers:
if header not in scraped_headers:
scraped_headers.append(header)
last_header = scraped_headers[-1]
print(header.text)

但是,我观察到了一种意想不到的行为,我似乎无法理解这种行为。在此代码之前的last_header.text 值的 print():

   driver.execute_script("arguments[0].scrollLeft += 50;", width_scrollbar)
time.sleep(.5)

将显示我抓取的最后一个标题(如预期;因此将与我的第一个 for 循环中的打印相匹配)。在代码之后的last_header.text值的print()将在web元素中显示最新的标题,即使没有理由(据我所知)为什么应该将其附加到列表中在那时候。因此,new_header.text将等于last_header.text,并且我的while循环将中断。

有趣的是,我似乎只能执行以下操作:

scraped_headers = []
headers = driver.find_elements_by_xpath("//div[@class='gbData']")
for header in headers:
if header not in scraped_headers:
scraped_headers.append(header)
print(header.text)
last_header = scraped_headers[-1]

width_scrollbar = driver.find_element_by_xpath("""/html/body/div[5]/div[2]/div/div/div/div/div[4]/div[5]/div[2]/div[3]""")

while True:
driver.execute_script("arguments[0].scrollLeft += 50;", width_scrollbar)
time.sleep(.5)
print(last_header.text)

- 我的程序将打印出现的每个新标题,直到它重复列表中的最后一个;但我不知道如何跳出循环!

这是怎么回事?我是否遗漏了一些明显的东西?

感谢任何帮助!

最佳答案

正如 @pcalkins 在评论中指出的那样,附加 header 的 .text 而不是对 header Web 元素的引用解决了我的问题。这个调整后的代码很好地完成了我想要的:

scraped_headers = []
headers = driver.find_elements_by_xpath("//div[@class='gbData']")
for header in headers:
if header.text not in scraped_headers:
scraped_headers.append(header.text)
print(header.text)
last_header = scraped_headers[-1]

width_scrollbar = driver.find_element_by_xpath("""/html/body/div[5]/div[2]/div/div/div/div/div[4]/div[5]/div[2]/div[3]""")

while True:
driver.execute_script("arguments[0].scrollLeft += 50;", width_scrollbar)
time.sleep(.5)
new_header = driver.find_elements_by_xpath("//div[@class='gbData']")[-1]
if new_header.text == last_header:
break
headers = driver.find_elements_by_xpath("//div[@class='gbData']")
for header in headers:
if header.text not in scraped_headers:
scraped_headers.append(header.text)
last_header = scraped_headers[-1]
print(header.text)

关于javascript - 在 Selenium 中滚动 webelement 后,值意外附加到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59586118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com