IFRAMEは何ですか?
<iframe>のタグには、別の文書に埋め込まれた現在のHTMLページで使用されているインラインフレームであり、そしてすべての主要なブラウザはiframeタグをサポートしています。
単純にページ内、つまり、置くだけでなく、ページに埋め込まれ、ページがあるように思われるが、セレンでは、要素がIFRAME内に直接配置することはできません
例:
網易クラウド音楽をプリントアウト - クラウド音楽ホット音楽チャートのトップ10曲の歌のタイトル
私たちは、最初の上位10曲の要素のランキングを見つけます
赤いボックスを使用して簡単に言えば、なぜid情報
-
位置付け要素は、一般的に、我々は最初の直接特定の曲情報を対象とします、そして、我々は曲のid属性は、長い数は、その後、私たちは番号がランダムに生成されていることを疑うする必要があることを見つけます
-
検証:要素IDの要素のid属性の値をコピーし、インターフェイスの刷新、再表示は、値が、その後、第1条の仮説を検証していない場合だけで、ダウンコピーした内容と一致している属性
-
第1条を検証した後、この時点で、私たちは何をする必要があるが、要素のプロパティの値に直接配置されている場合、トップを見つけることです、我々は見ることができます
-
親要素の値を直接かつ正確に位置決めすることができるクラス属性は、要素が利用可能です
-
上向き、青いボックスのid属性の値は、スクランブルされたコンテンツを見ることができ、我々は属性値の使用不能となり、第一の反応存在しています
-
ID越え=見属性値見つかった曲リスト - 事前キャッシュを注文することも、直接配置することができます
-
この時点では、第4条及び第6条の正確な位置決めを達成することができ、ここで著者は、id属性の習慣的な使用であり、
要素を見つけた後、私たちはラインとコードを直接、あなたは曲の情報をプリントアウトすることができます
セレンインポートwebdriverを ドライバ = webdriver.Chrome() driver.implicitly_wait( 10 ) #フェッチチャート情報 driver.get(' https://music.163.com/#/discover/toplist?id=3778678 ' ) DIV driver.find_elements_by_css_selector =(' #楽曲リスト・プリキャッシュ表.M-TR-ランクTBODY:テラス、N番目(-n + 10)B ' ) #forループ、各楽曲を取得要素、および印刷要素のテキスト属性値 のための一つでDIV: 印刷(one.get_attribute(「タイトル」)) driver.quit()
出力:
#暗黙の(10S)のための長い待ち時間の間に、出力は空であり、エラーはありません、これはなぜですか?
知識ポイント
-
find_elements:注秒、複数;リストの復帰、それは空のリストが返される要素を見つけることがある場合、エラーメッセージありません
-
find_element:指定された時間内に、要素が見つからない場合は要素を配置、それはエラーがスローされます
私たちのコードを変更します。
セレンインポートwebdriverを用 ドライバ = webdriver.Chrome() driver.implicitly_wait( 10 ) #は、チャート情報フェッチ driver.getを(' https://music.163.com/#/discover/toplist?id=3778678 ' ) 、songList driver.find_element_by_id =(' ソン・リスト・プリキャッシュ' ) DIV = songList.find_elements_by_css_selector(' .M-表ランクTBODYのTR:テラス、N番目(-n + 10)B ' ) #ループのため、取得します各曲の要素、およびテキスト要素のプロパティ値をプリントアウト するために一つでDIV: 印刷(ワン。GET_ATTRIBUTE( 'タイトル') )
driver.quit()
私たちの出力を見てください:
アッシそれ、8行目で間違っ本当にエラー、:songList = driver.find_element_by_id(歌リスト・キャッシュの事前 ');しかし、我々は明らかに、ブラウザ内の要素ああにナビゲートすることができますか?
ポジショニングはiframe
ポジショニングは、その後、私たちは汚い手口でiFrameにするか否かを検討する必要があり、問題ありません!
私たちの要素情報で再見
赤い箱の中から、我々が見る 、上記のid =「ソン・リスト・プリキャッシュ」親と子要素、我々は楽しみにして、青色のボックスを、#g_iframeの親要素があります
、青色のエリアをクリックしてのは、IFRAMEを見てみましょう
私たちは、IFRAMEのフレームワークで書かれている曲の情報チャートを決定することができ、どのように我々はそれでiframe要素は動作しますか?
IFRAMEを切り替えます
-
idと一意のIDを切り替えることにより、
-
-
driver.switch_to.frame( 'g_iframe')
-
-
名、および固有の名前を切り替えることにより、
-
driver.switch_to.frame( 'contentFrame')
-
-
idと名前がなければ、あなたがして切り替え、インラインフレームを検索する必要があります
-
IFRAME = driver.find_elements_by_tag_name( 'IFRAME')[0]
-
driver.switch_to.frame(IFRAME)
-
メイン文書に戻ってカット
私たちは、IFRAMEの枠組みにカットした後、あなたが再び動作するようにメインの文書領域に戻る必要があり、メイン文書に切り替えることが必要です
-
driver.switch_to_default_content()
マルチネストされたiframeの
既然主文档可以嵌套 iframe ,那么 iframe 同样可以嵌套 iframe ,那么存在这种多重嵌套我们要怎么处理呢?
<html> <iframe id="frame1"> <iframe id="frame2" / > </iframe> </html>
如果我们需要操作 iframe2 中的元素,我们需要切换 2 次
- 先从主文档切换至 iframe1
-
driver.switch_to.frame('iframe1')
-
- 再从 iframe1 切换至 iframe2
-
driver.switch_to.frame('iframe2')
-
我们切到 iframe2 中操作完之后,需要回到 iframe1 中进行操作,selenium 提供了一个更好的方式,避免了从 iframe2 切到主文档 再切到 iframe1 的复杂
-
从 iframe2 切回至 iframe1
-
driver.switch_to.parent_frame()
-
让我们来完成之前的需求:
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # 抓取排行榜信息 driver.get('https://music.163.com/#/discover/toplist?id=3778678') # 定位到 iframe 的元素 iframe = driver.find_elements_by_tag_name('iframe')[0] # 切到 iframe 框架内 driver.switch_to.frame(iframe) songList = driver.find_element_by_id('song-list-pre-cache') div = songList.find_elements_by_css_selector('.m-table-rank tbody tr:nth-child(-n+10) b') # 使用for循环,获取到每首歌曲的元素,并打印出该元素的 text 属性值 for one in div: print(one.get_attribute('title')) # 切到 iframe 的上一层,即为主文档 driver.switch_to.parent_frame() # 打印主文档的一段内容 meta = driver.find_element_by_css_selector('meta[name="description"]') print('\n'+meta.get_attribute('content')) driver.quit()
输出结果如下:
心如止水
多想在平庸的生活拥抱你
归去来兮
晚安
我曾
四块五
出山
Monsters
那个女孩
像鱼
网易云音乐是一款专注于发现与分享的音乐产品,依托专业音乐人、DJ、好友推荐及社交功能,为用户打造全新的音乐生活。
参考文档:
selenium切换到iframe:https://www.cnblogs.com/xiaoxiaolvdou/p/9316805.html