我正在为一个类编写脚本,并且执行以下代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import random
import time
x = random.randrange(1, 16)
i = f"mntl-recipe-card-meta_{x}-0"
url = "https://www.eatingwell.com/recipes/17947/mealtimes/dinner/"
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)
link = driver.find_element(By.ID, i)
link.click()
time.sleep(2)
current_url = driver.execute_script("return window.location.href;")
print("Current URL:", current_url)
driver.quit()
代码一直运行,直到必须单击链接,然后抛出一个错误,显示“WebDriverException:消息:没有这样的执行上下文”。在我单击链接后,似乎会抛出错误,因为程序在新页面加载时停止工作。我希望能够在单击元素后执行操作,这样程序就会停止工作。
您发布的代码对我来说效果很好。我做了一些更改,向您展示一些潜在的改进,如果您发现它们有用的话......也许它会为您解决问题。
您可以使用 CSS 选择器获取页面上的所有食谱链接
links = driver.find_elements(By.CSS_SELECTOR, "[id^='mntl-card-list-items_']")
通过使用#1,我们在页面上有一个包含所有此类链接的列表,我们可以使用
random.choice()
从列表中选择一个随机项目,而不是插入随机数 1-16(这不会获得所有链接)链接)。
link = random.choice(links)
现在您的代码所做的就是单击链接,然后在导航后获取 URL。如果您想要的只是 URL,则无需点击即可从首页获取该 URL。
print(link.get_attribute("href"))
如果您想要浏览器中的当前 URL,则不需要 JavaScript...您可以使用
current_url = driver.current_url
你不需要睡觉
完整的工作代码是
from selenium import webdriver
from selenium.webdriver.common.by import By
import random
url = "https://www.eatingwell.com/recipes/17947/mealtimes/dinner/"
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)
links = driver.find_elements(By.CSS_SELECTOR, "[id^='mntl-card-list-items_']")
link = random.choice(links)
print(link.get_attribute("href"))
link.click()
current_url = driver.current_url
print("Current URL:", current_url)