哈岁NB 发表于 2023-7-19 11:13:10

selenium

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

page = 3
list_1 = []
index_url = 'https://www.lagou.com/'
path = 'D:/技能/chromedriver.exe'
brower = webdriver.Chrome(executable_path=path)
brower.get(index_url)
time.sleep(50)
search_box = brower.find_element(By.XPATH,'//*[@id="search_input"]')
search_button = brower.find_element(By.XPATH,'//*[@id="search_button"]')
search_box.send_keys('python')
next_button = brower.find_element(By.XPATH,'//*[@id="jobList"]/div/ul/li/a')
time.sleep(2)
search_button.click()
time.sleep(5)
pattern = re.compile('"positionId":(\d+)', re.S)
list_1 += re.findall(pattern, brower.page_source)
print('爬取第1页')
next_button.click()
for i in range(2,page+1):
    list_1 += re.findall(pattern, brower.page_source)
    next_button.click()
    print(f'爬取第{i}页')


print(len(list_1))
print(list_1)
brower.close()
这个是我的报错信息

陶远航 发表于 2023-7-19 11:13:37

根据您提供的代码和报错信息,错误发生在定位下一页按钮的那行代码上。报错提示说明无法找到该元素。

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

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

   示例代码:

      from selenium.webdriver.support.ui import WebDriverWait
   from selenium.webdriver.support import expected_conditions as EC

   # 在点击搜索按钮后,等待页面加载完成
   wait = WebDriverWait(brower, 10)
   wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="jobList"]/div/ul/li/a')))
   

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

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

   示例代码:

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

通过检查上述可能的原因并尝试相应的解决方法,您应该能够成功定位到下一页按钮。希望这些信息对您有所帮助!如果您有任何进一步的问题,请随时提问。

isdkz 发表于 2023-7-19 11:13:52

你的问题可能与以下几个因素有关:

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

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

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

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

下面是一个使用 WebDriverWait 的示例:

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

brower = webdriver.Chrome(executable_path=path)
brower.get(index_url)

search_box = WebDriverWait(brower, 10).until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="search_input"]'))
)
search_button = WebDriverWait(brower, 10).until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="search_button"]'))
)

search_box.send_keys('python')
search_button.click()

next_button = WebDriverWait(brower, 10).until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="jobList"]/div/ul/li/a'))
)
next_button.click()


这段代码会在查找元素前等待10秒,如果在10秒内元素出现,则继续执行代码;如果10秒内元素未出现,则抛出异常。

歌者文明清理员 发表于 2023-7-19 11:14:03

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

page = 3
list_1 = []
index_url = 'https://www.lagou.com/'
path = 'D:/技能/chromedriver.exe'
brower = webdriver.Chrome(executable_path=path)
brower.get(index_url)
time.sleep(50)
search_box = brower.find_element(By.XPATH, '//*[@id="search_input"]')
search_button = brower.find_element(By.XPATH, '//*[@id="search_button"]')
search_box.send_keys('python')
search_button.click()
time.sleep(5)

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

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

print(len(list_1))
print(list_1)
brower.close()

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


注:此回答由 GPT 生成,其他类似回答也是 GPT 生成,仅供参考。如果遇到非 GPT 回答请优先采纳。

歌者文明清理员 发表于 2023-7-19 11:16:06

isdkz 发表于 2023-7-19 11:13
你的问题可能与以下几个因素有关:

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

草,慢了

isdkz 发表于 2023-7-19 11:17:36

歌者文明清理员 发表于 2023-7-19 11:16
草,慢了

selenium肯定慢呀

歌者文明清理员 发表于 2023-7-19 11:18:01

isdkz 发表于 2023-7-19 11:17
selenium肯定慢呀

估计得……
占楼大法!

哈岁NB 发表于 2023-7-19 11:19:17

isdkz 发表于 2023-7-19 11:13
你的问题可能与以下几个因素有关:

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

好的,感谢感谢

哈岁NB 发表于 2023-7-19 11:20:01

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

定位 ...

好的,感谢感谢

哈岁NB 发表于 2023-7-19 11:20:39

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

好的,感谢感谢

陶远航 发表于 2023-7-19 11:21:41

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

selenium比requests慢{:10_256:}

建议:
不用脚本
页: [1]
查看完整版本: selenium