当前位置: 首页 > 知识库问答 >
问题:

在Selenium中滚动webelement后意外追加到列表的值

闾丘卓
2023-03-14

我对python(以及一般编程)是新手,我想从使用Selenium滚动后动态更新的webelement中刮取数据,类似于本文:尝试使用python和Selenium迭代地滚动和刮取网页。与问题中的截图类似,我的webelement是一个带有标题的数据表,其中可能有水平或垂直滚动条。

我要做的第一件事是在我的webelement上滚动(一次滚动一列,这样就不会跳过任何列),并刮遍所有的标题。到目前为止,我可以确认我的webelement的水平滚动条有正确的xpath,并且我能够一次在webelement上水平滚动一列。请参见下面的代码,这是我从这个问题Python Selenium-distry pause_time中调整的代码,以便在无限页面中向下滚动:

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)
   driver.execute_script("arguments[0].scrollLeft += 50;", width_scrollbar)
   time.sleep(.5)

将显示我刮取的最后一个标头(如预期的那样;因此将匹配我的第一个for循环中的打印)。在该代码后面的last_header.text值的print()将显示webelement中最新的头,尽管没有理由(据我所知)将其追加到列表中。因此,new_header.text将等于last_header.text,my 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)

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

共有1个答案

骆昊阳
2023-03-14

正如@Pcalkins在评论中指出的那样,追加标题的。text而不是对标题webelement的引用解决了我的问题。经过调整的代码很好地完成了我想要的:

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)
 类似资料:
  • 问题内容: 我正在编写一个包含10个存储桶列表的简单哈希表。使用内置函数计算索引,然后对表大小取模。但是,当我尝试将对象附加到该索引的存储桶列表时,它会附加到每个存储桶列表。我尝试用不同的方式定义add_HT,但我一直得到相同的结果。我究竟做错了什么? 问题答案: 使指向 同一列表 的指针数量增加。这里不是问题。您需要定义为。

  • 我有一个for循环,它遍历CSV中的每一行,我创建了一个包含列表的字典,但是列表被重写了,因为字典键被重复了几次。我如何总结或追加到列表中的第二(1)位置相同的键的下一个值下一个循环迭代? 因为使用append时,如果再次找到现有键,则会覆盖该值,因此该键的值会被一次又一次地覆盖。 CSV中的字段包括: 输出应该是这样的:

  • 我试图从包含列表的json中提取一个字段,然后将该列表附加到数据帧中,但遇到了一些不同的错误。 我想我可以将其写入csv,然后用Pandas读取csv,但我尽量避免写入任何文件。我知道我也可以使用StringIO生成csv,但这存在空字节问题。替换这些将是(我认为)另一个逐行的步骤,这将进一步延长脚本完成所需的时间。。。我正在对一个返回成千上万个结果的查询运行此操作,因此保持它的快速和简单是一个优

  • 我有一个,它使用一个数据源在用户向下滚动时部分加载适配器中的项,即某种“分页” 我需要在列表中添加来自不同数据源的项目,我真的无法修改我提到的第一个数据源来服务所有内容 问题是:向下滚动时,如何知道要使用哪个数据源并从中添加项目?例如 1。从源A添加项目 2。用户滚动 3。从源B添加项目 4。用户滚动 5次。Source-A中没有更多的项目,Source-B中项目的标题可见,因此我应该开始从Sou

  • 问题内容: 我创建了一个带有JTextArea的JFrame。我想在每次追加后自动向下滚动文本区域。我应该如何处理? 我已经尝试过,但是什么都没有改变。 问题答案: 有两种方法(但必须将JTextArea放在JScrollPane中) a)设置插入符号(方法正确) 例如 b)从(从)移至最大值

  • 我有一个两个项目的列表,每个项目是一个文本字符串。我想围绕这两个项目循环,如果一个单词不在一组单词中,则基本上删除它。但是,下面的代码将所有单词放在一起,而不是创建两个单独的项。我希望我的更新列表包含两个项目,每个原始项目对应一个im更新: