我正在尝试从此链接检索作业说明和作业要求: https://www.jobsbank.gov.sg/ICMSPortal/portlets/JobBankHandler/SearchDetail.do?id=JOB-2016-0008238
使用硒。这是我的代码:
driver = webdriver.Firefox()
url = "https://www.jobsbank.gov.sg/ICMSPortal/portlets/JobBankHandler/SearchDetail.do?id=JOB-2016-0008238"
driver.get(url)
iframes = driver.find_elements_by_xpath('//*[@id="divMainJobDescription"]')
print len(iframes)
driver.switch_to_frame(iframes)
print driver.page_source
我收到以下错误:
Traceback(最近一次调用最后一次):文件“D:\ scraper.py”,第79行,in main()文件“D:\ Abigail MTI Projects \ Singapore Skills \ JobsBankScraper \ jobsbank14012016_abi.py”,第74行,主要 driver.switch_to_frame(iframes)文件“C:\ Python27 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py”, 第537行,在switch_to_frame中 self._switch_to.frame(frame_reference)文件“C:\ Python27 \ lib \ site-packages \ selenium \ webdriver \ remote \ switch_to.py”, 第67行,在框架中 self._driver.execute(Command.SWITCH_TO_FRAME,{'id':frame_reference})文件 “C:\ Python27 \ LIB \站点包\硒\ webdriver的\遥控\ webdriver.py” 201行,执行中 self.error_handler.check_response(response)文件“C:\ Python27 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py”, 第181行,在check_response中 raise exception_class(message,screen,stacktrace)NoSuchFrameException:Message:无法找到frame:[object Object] 堆栈跟踪: 在FirefoxDriver.prototype.switchToFrame(file:/// c:/users/mti_wl~1/appdata/local/temp/tmpwelh3x/extensions/fxdriver@googlecode.com/components/driver-component.js:10745) 在DelayedCommand.prototype.executeInternal_ / h(file:/// c:/users/mti_wl~1/appdata/local/temp/tmpwelh3x/extensions/fxdriver@googlecode.com/components/command-processor.js:12551) 在DelayedCommand.prototype.executeInternal_(file:/// c:/users/mti_wl~1/appdata/local/temp/tmpwelh3x/extensions/fxdriver@googlecode.com/components/command-processor.js:12556) 在DelayedCommand.prototype.execute /< (文件:/// C:/users/mti_wl~1/appdata/local/temp/tmpwelh3x/extensions/fxdriver@googlecode.com/components/command-processor.js:12498)
答案 0 :(得分:0)
iframes
是列表,您需要切换到单个框架。
driver.find_elements
返回列表,而driver.find_element
返回单个网络元素(请注意元素中的'')
此外,divMainJobDescription
不是iframe
,我相信您正在寻找frameJobDescription
iframe = driver.find_element_by_id("frameJobDescription")
答案 1 :(得分:0)
您需要定位iframe,切换到该帧,然后您可以开始识别该帧内存在的其他元素,如div。您需要指定 iframe标记本身,而不是iframe中的元素。
所以,不要在框架内立即定位div,如
iframes = driver.find_elements_by_xpath('//*[@id="divMainJobDescription"]')
定位iframe标记,然后切换。 (如果只需要一个iframe,可以使用单数find_ 元素 _by_xpath。)
iframe = driver.find_element_by_xpath('//iframe[@id="frameJobDescription"]')
driver.switch_to_frame(iframe)
job_description = driver.find_element_by_xpath('//*[@id="divMainJobDescription"]')
奖励:您可以使用其他方法来定位iframe,例如,如果您只查看ID,则按ID查找元素而不是编写xpath。
iframe = driver.find_element_by_id('frameJobDescription')
如果您需要在脚本中获取BOTH iframe中的详细信息,则需要轮流切换帧。