【发布时间】:2020-07-30 02:55:14
【问题描述】:
我在 python 中结合 selenium 创建了一个脚本,以从其登录页面获取答案的number,并从其内页获取提问者的name。我知道使用问题链接和下一页链接更容易抓取这两个项目,但这不是我打算在这里做的。底线是我试图只使用点击来遍历不同的地方。但是,当我运行该脚本时,它会在第二次迭代中抛出指向这一行 answer = WebDriverWait(item,10) 的以下错误。
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
虽然我要找的元素在登陆页和内页都有,但要求我从两个不同的深度抓取这两个元素。
我知道如何使用请求来抓取它们,所以我也不愿意走那条路。
我正在尝试的脚本:
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
link = 'https://stackoverflow.com/questions/tagged/web-scraping'
def get_content(link):
driver.get(link)
while True:
for count,item in enumerate(WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,".question-summary")))):
#error thrown in the following line in it's second iteration
answer = WebDriverWait(item,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,"[class$='answered'] > strong"))).text
elem = driver.find_elements_by_css_selector(".summary a.question-hyperlink")[count]
driver.execute_script("arguments[0].click();",elem)
name = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,"h1[itemprop='name'] > a"))).text
print(answer,name)
driver.back()
try:
next_page = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,"a[rel='next']")))
driver.execute_script("arguments[0].click();",next_page)
except Exception:
break
if __name__ == '__main__':
with webdriver.Chrome() as driver:
get_content(link)
如何从两个不同的深度刮取这两个项目?
PS 如果我踢掉这行answer = WebDriverWait(item,10)----,脚本运行起来就像一个穿越不同深度和多个页面的魅力。
【问题讨论】:
标签: python python-3.x selenium selenium-webdriver web-scraping