鱼C论坛

 找回密码
 立即注册
查看: 1188|回复: 10

[已解决]selenium

[复制链接]
发表于 2023-7-19 11:13:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问这个下一页按钮怎么定位不到呢
  1. import re
  2. import time
  3. from selenium import webdriver
  4. from selenium.webdriver.common.by import By

  5. page = 3
  6. list_1 = []
  7. index_url = 'https://www.lagou.com/'
  8. path = 'D:/技能/chromedriver.exe'
  9. brower = webdriver.Chrome(executable_path=path)
  10. brower.get(index_url)
  11. time.sleep(50)
  12. search_box = brower.find_element(By.XPATH,'//*[@id="search_input"]')
  13. search_button = brower.find_element(By.XPATH,'//*[@id="search_button"]')
  14. search_box.send_keys('python')
  15. next_button = brower.find_element(By.XPATH,'//*[@id="jobList"]/div[3]/ul/li[9]/a')
  16. time.sleep(2)
  17. search_button.click()
  18. time.sleep(5)
  19. pattern = re.compile('"positionId":(\d+)', re.S)
  20. list_1 += re.findall(pattern, brower.page_source)
  21. print('爬取第1页')
  22. next_button.click()
  23. for i in range(2,page+1):
  24.     list_1 += re.findall(pattern, brower.page_source)
  25.     next_button.click()
  26.     print(f'爬取第{i}页')


  27. print(len(list_1))
  28. print(list_1)
  29. brower.close()
复制代码

这个是我的报错信息
最佳答案
2023-7-19 11:13:37
根据您提供的代码和报错信息,错误发生在定位下一页按钮的那行代码上。报错提示说明无法找到该元素。

定位元素时,常见的问题包括元素路径不正确、页面尚未完全加载或元素被覆盖等。以下是可能导致无法定位到下一页按钮的一些原因和解决方法:

1. 页面加载时间不足:在点击搜索按钮之后,您使用了time.sleep(5)来等待页面加载。但是,这种固定的等待时间可能不够,特别是在网络状况较差或网页内容加载较慢的情况下。建议使用显式等待来等待页面加载完成,例如使用WebDriverWait类来等待元素出现。

   示例代码:

  
  1.    from selenium.webdriver.support.ui import WebDriverWait
  2.    from selenium.webdriver.support import expected_conditions as EC
  3.    # 在点击搜索按钮后,等待页面加载完成
  4.    wait = WebDriverWait(brower, 10)
  5.    wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="jobList"]/div[3]/ul/li[9]/a')))
  6.    
复制代码

2. 元素路径不正确:检查XPath路径是否正确。如果页面结构或布局发生变化,可能会导致XPath路径失效。可以使用浏览器的开发者工具重新检查元素的XPath路径,并确保它仍然有效。

3. 元素在iframe中:如果下一页按钮位于iframe内部,您需要先切换到该iframe,然后再查找元素。可以使用switch_to.frame()方法进行切换。

   示例代码:

  
  1.    iframe = brower.find_element(By.XPATH, '//*[@id="iframe_id"]')
  2.    brower.switch_to.frame(iframe)
  3.    # 然后再定位下一页按钮
  4.    
复制代码

通过检查上述可能的原因并尝试相应的解决方法,您应该能够成功定位到下一页按钮。希望这些信息对您有所帮助!如果您有任何进一步的问题,请随时提问。
屏幕截图(79).png
屏幕截图(80).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-19 11:13:37 | 显示全部楼层    本楼为最佳答案   
根据您提供的代码和报错信息,错误发生在定位下一页按钮的那行代码上。报错提示说明无法找到该元素。

定位元素时,常见的问题包括元素路径不正确、页面尚未完全加载或元素被覆盖等。以下是可能导致无法定位到下一页按钮的一些原因和解决方法:

1. 页面加载时间不足:在点击搜索按钮之后,您使用了time.sleep(5)来等待页面加载。但是,这种固定的等待时间可能不够,特别是在网络状况较差或网页内容加载较慢的情况下。建议使用显式等待来等待页面加载完成,例如使用WebDriverWait类来等待元素出现。

   示例代码:

  
  1.    from selenium.webdriver.support.ui import WebDriverWait
  2.    from selenium.webdriver.support import expected_conditions as EC
  3.    # 在点击搜索按钮后,等待页面加载完成
  4.    wait = WebDriverWait(brower, 10)
  5.    wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="jobList"]/div[3]/ul/li[9]/a')))
  6.    
复制代码

2. 元素路径不正确:检查XPath路径是否正确。如果页面结构或布局发生变化,可能会导致XPath路径失效。可以使用浏览器的开发者工具重新检查元素的XPath路径,并确保它仍然有效。

3. 元素在iframe中:如果下一页按钮位于iframe内部,您需要先切换到该iframe,然后再查找元素。可以使用switch_to.frame()方法进行切换。

   示例代码:

  
  1.    iframe = brower.find_element(By.XPATH, '//*[@id="iframe_id"]')
  2.    brower.switch_to.frame(iframe)
  3.    # 然后再定位下一页按钮
  4.    
复制代码

通过检查上述可能的原因并尝试相应的解决方法,您应该能够成功定位到下一页按钮。希望这些信息对您有所帮助!如果您有任何进一步的问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 11:13:52 | 显示全部楼层
你的问题可能与以下几个因素有关:

1. 页面加载时间:可能在你尝试定位元素时,页面还没有完全加载。你可以尝试增加 time.sleep() 的等待时间,或者使用 WebDriverWait 来等待元素加载完成。

2. XPATH的正确性:可能你的XPATH不正确,或者元素在iframe中。你可以尝试在浏览器的开发者工具中检查元素的XPATH是否正确,或者检查元素是否在iframe中。

3. 动态加载的元素:如果元素是动态加载的,那么可能在页面加载完成后才会出现。这种情况下,你可以使用 WebDriverWait 等待元素出现。

在你的代码中,你在查找下一页按钮的XPATH时,可能是在页面加载完成前就开始查找,导致找不到元素。你可以尝试在点击搜索按钮后,使用 WebDriverWait 等待元素加载完成,然后再查找下一页按钮。

下面是一个使用 WebDriverWait 的示例:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. brower = webdriver.Chrome(executable_path=path)
  6. brower.get(index_url)
  7. search_box = WebDriverWait(brower, 10).until(
  8.     EC.presence_of_element_located((By.XPATH, '//*[@id="search_input"]'))
  9. )
  10. search_button = WebDriverWait(brower, 10).until(
  11.     EC.presence_of_element_located((By.XPATH, '//*[@id="search_button"]'))
  12. )
  13. search_box.send_keys('python')
  14. search_button.click()
  15. next_button = WebDriverWait(brower, 10).until(
  16.     EC.presence_of_element_located((By.XPATH, '//*[@id="jobList"]/div[3]/ul/li[9]/a'))
  17. )
  18. next_button.click()
复制代码

这段代码会在查找元素前等待10秒,如果在10秒内元素出现,则继续执行代码;如果10秒内元素未出现,则抛出异常。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 11:14:03 | 显示全部楼层
报错信息没有提供,但是根据代码的逻辑,可能出现问题的地方是定位下一页按钮的地方。请确保next_button元素的XPath表达式是准确的,可以通过检查网页源代码来确认。另外,请注意等待页面加载完成后再进行元素的查找和操作,可以使用WebDriverWait来设置显式等待。以下是修改建议的代码:
  1. import re
  2. import time
  3. from selenium import webdriver
  4. from selenium.webdriver.common.by import By
  5. from selenium.webdriver.support.ui import WebDriverWait
  6. from selenium.webdriver.support import expected_conditions as EC

  7. page = 3
  8. list_1 = []
  9. index_url = 'https://www.lagou.com/'
  10. path = 'D:/技能/chromedriver.exe'
  11. brower = webdriver.Chrome(executable_path=path)
  12. brower.get(index_url)
  13. time.sleep(50)
  14. search_box = brower.find_element(By.XPATH, '//*[@id="search_input"]')
  15. search_button = brower.find_element(By.XPATH, '//*[@id="search_button"]')
  16. search_box.send_keys('python')
  17. search_button.click()
  18. time.sleep(5)

  19. pattern = re.compile('"positionId":(\d+)', re.S)
  20. list_1 += re.findall(pattern, brower.page_source)
  21. print('爬取第1页')

  22. for i in range(2, page+1):
  23.     # 显式等待下一页按钮可点击
  24.     next_button = WebDriverWait(brower, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="jobList"]/div[3]/ul/li[9]/a')))
  25.     list_1 += re.findall(pattern, brower.page_source)
  26.     next_button.click()
  27.     print(f'爬取第{i}页')
  28.     time.sleep(2)

  29. print(len(list_1))
  30. print(list_1)
  31. brower.close()
复制代码

注意,以上只是修改建议,并没有完全了解你的页面结构和需求。如果还有报错,请提供完整的报错信息。


注:此回答由 GPT 生成,其他类似回答也是 GPT 生成,仅供参考。如果遇到非 GPT 回答请优先采纳。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 11:16:06 | 显示全部楼层
isdkz 发表于 2023-7-19 11:13
你的问题可能与以下几个因素有关:

1. 页面加载时间:可能在你尝试定位元素时,页面还没有完全加载。你可 ...


草,慢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 11:17:36 | 显示全部楼层

selenium肯定慢呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 11:18:01 | 显示全部楼层
isdkz 发表于 2023-7-19 11:17
selenium肯定慢呀

估计得……
占楼大法!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-19 11:19:17 | 显示全部楼层
isdkz 发表于 2023-7-19 11:13
你的问题可能与以下几个因素有关:

1. 页面加载时间:可能在你尝试定位元素时,页面还没有完全加载。你可 ...

好的,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-19 11:20:01 | 显示全部楼层
陶远航 发表于 2023-7-19 11:13
根据您提供的代码和报错信息,错误发生在定位下一页按钮的那行代码上。报错提示说明无法找到该元素。

定位 ...

好的,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-19 11:20:39 | 显示全部楼层
歌者文明清理员 发表于 2023-7-19 11:14
报错信息没有提供,但是根据代码的逻辑,可能出现问题的地方是定位下一页按钮的地方。请确保next_button元 ...

好的,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 11:21:41 | 显示全部楼层
歌者文明清理员 发表于 2023-7-19 11:14
报错信息没有提供,但是根据代码的逻辑,可能出现问题的地方是定位下一页按钮的地方。请确保next_button元 ...

selenium比requests慢

建议:
不用脚本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-3 03:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表