如何从在 Python 中使用 react.js 和 Selenium 的网页抓取数据?

IT技术 python reactjs selenium web-scraping webdriverwait
2021-04-29 23:33:13

我在抓取一个使用的网站时遇到了一些困难react.js,但不确定为什么会发生这种情况。

这是网站的html: 在此处输入图片说明

我希望做的是单击带有class: play-pause-button btn btn -naked. 但是,当我使用 Mozilla gecko webdriver 加载页面时,会抛出一个异常说

Message: Unable to locate element: .play-pause-button btn btn-naked

这让我觉得也许我应该做点其他事情来获得这个元素?到目前为止,这是我的代码:

driver.get("https://drawittoknowit.com/course/neurological-system/anatomy/peripheral-nervous-system/1332/brachial-plexus---essentials")
    # execute script to scroll down the page
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return lenOfPage;")
    time.sleep(10)        
    soup = BeautifulSoup(driver.page_source, 'lxml')
    print(driver.page_source)
    play_button = driver.find_element_by_class_name("play-pause-button btn btn-naked").click()
    print(play_button)

有没有人知道我该如何解决这个问题?任何帮助深表感谢

1个回答

看来你很接近了。使用时,find_element_by_class_name()不能传递多个类,并且只能传递一个classname,即只能传递以下任中的一个:

  • play-pause-button
  • btn
  • btn-naked

在通过多个类时,find_element_by_class_name()您将面临消息:无效选择器:不允许复合类名


解决方案

作为替代方案,由于该元素是一个Angular元素,click()因此您必须在该元素上引入WebDriverWaitelement_to_be_clickable()您可以使用以下任一定位器策略

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.play-pause-button.btn.btn-naked")))click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='play-pause-button btn btn-naked']")))click()
    
  • 注意:您必须添加以下导入:

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