【问题标题】:Selenium web scraping iframeSelenium 网页抓取 iframe
【发布时间】:2021-05-19 03:12:41
【问题描述】:

我想在我办公室的各种打印机的网页上读取碳粉值。

问题是页面是由几帧组成的,其中有剩余墨粉的那一帧是用js写的,用selenium也看不懂

这是我的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import (
    presence_of_element_located)
from selenium.webdriver.support.wait import WebDriverWait

def get_comment_count(driver, url):
    driver.get(url)
    wait = WebDriverWait(driver, 3)
    e = driver.find_elements_by_xpath("/html/frameset/frame")
    driver.switch_to_frame(e[0])
    toner_iframe = driver.find_elements_by_xpath('//*[@id="contain"]')
    # iframe_url = toner_iframe.get_attribute('src')
    #driver.switch_to_frame(toner_iframe)
    driver.switch_to.frame(toner_iframe)
    print(toner_iframe)
    
url = "https://pritner_web_page"

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')

driver = webdriver.Chrome(options=options)

get_comment_count(driver,url)

我也试过了……

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

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')

driver = webdriver.Chrome(options=options)
driver.get("http://printer_web_page")


WebDriverWait(driver,5).until(EC.frame_to_be_available_and_switch_to_it((By.ID,'wlmframe')))

WebDriverWait(driver,5).until(EC.frame_to_be_available_and_switch_to_it((By.ID,'toner')))
page_source=driver.page_source
print(page_source)

这是页面的 DOM Inspector。各种帧都是动态的,用js写的如下:

我编写的代码只是获取框架的几种不同尝试之一,但无济于事

【问题讨论】:

  • 我看到您正在搜索 iframe 元素,而不是元素。您是否尝试过类似的方法:toner_iframe = driver.find_element_by_xpath('//*[@id=“toner”]’) ,然后使用 driver.switch_to.frame(toner_iframe) 切换到它
  • 是的,我试过了,但这是结果... selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“method”:“xpath”,选择器":"//*[@id="toner"]"}

标签: python selenium xpath iframe css-selectors


【解决方案1】:

该元素位于嵌套的 <frame> / <iframe> 元素中,因此您必须:

  • 诱导WebDriverWait 使 框架可用并切换到它

  • 诱导 WebDriverWait 使 child 框架可用并切换到它

  • 诱导WebDriverWait 使所需的元素可点击

  • 您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      driver.get("http://printer_web_page")
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"frame[name='wlmframe']")))
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#toner[name='toner']")))
      
    • 使用XPATH:

      driver.get("http://printer_web_page")
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//frame[@name='wlmframe']")))
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='toner' and @name='toner']")))
      
  • 注意:您必须添加以下导入:

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

参考

您可以在以下位置找到一些相关讨论:

【讨论】:

  • 我也试过这个解决方案,但这是错误:Traceback(最近一次调用最后一次):文件“c:\Users\j972537\Desktop\Venv_Scraping\Scraping\scraping_toner_3.py”,第 15 行, 在 WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@name='wlmframe']"))) 文件“C:\Users\j972537\Desktop\ Venv_Scraping\Scraping\lib\site-packages\selenium\webdriver\support\wait.py",第 80 行,直到引发 TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:
  • 与 css 选择器相同的错误:WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[name='wlmframe']"))) 文件 "C: \Users\j972537\Desktop\Venv_Scraping\Scraping\lib\site-packages\selenium\webdriver\support\wait.py",第 80 行,直到引发 TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException:留言:
  • @Gian76 我现在已经修复了代码中有一个错误。重新测试并告诉我结果。
猜你喜欢
  • 2017-01-16
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多