建议收藏,情况很常见哦!!!
我们在自动化抓取的时候,常常遇到多层iframe页面嵌套。并且还有子节点嵌套的情况。
image.png然后快速定位
import pyppeteer
browser = await pyppeteer.launch({
'headless': False, # 关闭无头模式
# 'devtools': True, # 打开 chromium 的 devtools
'executablePath': r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe',
'args': [
'--disable-extensions',
'--hide-scrollbars',
'--disable-bundled-ppapi-flash',
'--mute-audio',
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-gpu',
'--disable-infobars',
# f'--proxy-server={ip}:{port}' # 代理
],
'dumpio': True,
})
page = await browser.newPage()
await page.goto('https://login2.htm') # 打开网页
frame = page.frames # 获取所有的iframe
# 多层frame, 快速定位元素所在哪个frame中
for i, b in enumerate(frame):
for j in b.childFrames:
slider = await j.xpath('/html/body/center')
print(i, slider)
b.childFrames :获取iframe框架的子框架
效果图
image.png定位到是第二个frame中
selenium定位
frame = self.driver.find_elements_by_tag_name("iframe")
for i, b in enumerate(frame):
self.driver.switch_to.frame(self.driver.find_elements_by_tag_name("iframe")[i])
try:
slider = self.driver.find_element_by_xpath('//*[@id="module-YrEpAzATZ"]/div/div[4]/div[2]/a/div')
print(i, slider)
except:
...
for num, j in enumerate(self.driver.find_elements_by_tag_name("iframe")):
self.driver.switch_to.frame(self.driver.find_elements_by_tag_name("iframe")[num])
try:
slider = self.driver.find_element_by_xpath('//*[@id="module-YrEpAzATZ"]/div/div[4]/div[2]/a/div')
print(i, j, slider)
except:
...
for fnum, f in enumerate(self.driver.find_elements_by_tag_name("iframe")):
self.driver.switch_to.frame(self.driver.find_elements_by_tag_name("iframe")[fnum])
try:
slider = self.driver.find_element_by_xpath(
'//*[@id="module-YrEpAzATZ"]/div/div[4]/div[2]/a/div')
print(i, j, f, slider)
except:
...
self.driver.switch_to.parent_frame() # 回到父节点
self.driver.switch_to.parent_frame() # 回到父节点
self.driver.switch_to.parent_frame() # 回到父节点
网友评论