1. ID に基づいて検索します。
Baidu Web サイトのホームページを例に挙げると、F12 キーを押して開発者ツールを開き、ページ要素の情報を表示します。
<!-- 百度主页下的搜索输入框html结构 -->
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
driver.find_element(By.ID, "kw")
2. 名前による位置付け
driver.find_element(By.NAME, "wd")
3、クラスの位置付けに応じて
driver.find_element(By.CLASS_NAME, "s_ipt")
class 属性の値にスペースが含まれている場合、クラスの配置を使用するとエラーが報告されます。
4. tag_name に応じた配置
tag はタグであり、tag_name は html 内のタグ名によって配置されます。通常、ページ内のタグは一意ではなく、tag_name だけでは正確な位置決めを行うことができません。
# 找出所有input标签
tag_input = driver.find_elements(By.TAG_NAME, "input")
for i in tag_input:
# 找出input标签中id属性是kw的
if i.get_attribute('id') == 'kw':
# 执行需要的动作
i.send_keys("tag定位")
5. link_text に従った配置
<!-- 百度主页下的hao123链接的html结构 -->
<a href="https://www.hao123.com?src=from_pc_logon" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>
link_text とpartial_link_text は、<a> タグ内のテキストを見つけます。
link_text は完全に一致します。
driver.find_element(By.LINK_TEXT, "hao123")
6.partial_link_textによる位置決め
Partial_link_text はあいまい一致です。
driver.find_element(By.PARTIAL_LINK_TEXT, "hao")
7. css_selectorによる配置
css_selector の配置は、ID セレクター、クラス セレクター、ラベル セレクター、属性セレクターに細分化できます。
これは、Baidu ホームページの検索入力ボックスの例でもあります。
1. IDセレクター
driver.find_element(By.CSS_SELECTOR, "#kw")
2. クラスセレクター
driver.find_element(By.CSS_SELECTOR, ".s_ipt")
class 属性の値にスペースが含まれる場合は、各スペースの前に「.」を追加します。
driver.find_element(By.CSS_SELECTOR, ".bg.s_btn")
3. ラベルセレクター
driver.find_element(By.CSS_SELECTOR, "input")
4. 属性セレクター
driver.find_element(By.CSS_SELECTOR, "[id='kw']")
5. 一般的に使用される CSS セレクター
セレクタ | 例 | 説明例 |
---|---|---|
。クラス | .s_ipt | class="s_ipt" の要素を選択します |
#id | #kw | id="kw" の要素を選択します |
* ^ $ | クラス*="ip" クラス^="s_" クラス$="pt" |
ipを含むクラス要素を選択/s_kで始まる/ptで終わる |
エレメント | p | すべての <p> 要素を選択します |
要素、要素 | ディビジョン、p | すべての <div> 要素とすべての <p> 要素を選択します |
要素要素 | ディビジョンp | <div> の子孫を選択 <p> |
要素>要素 | div>p | <div> 子要素 <p> を選択します |
要素+要素 | div+p | <div> の直後にある兄弟要素 <p> を選択します。 |
要素~要素 | 分割~P | <div> の後のすべての兄弟要素 <p> を選択します |
[属性] | [目標] | ターゲット属性を持つ要素を選択する |
[属性=値] | [ターゲット = "_blank"] | ターゲット属性が _blank である要素を選択します |
:n番目の子(n) | p:n番目の子(2) p:nth-last-child(2) |
親の最後から 2 番目の子である <p> 要素を選択します |
論理的な位置付け
通常、セレクターは、接続に論理演算子を使用せずに組み合わせて使用できます。
「タグ名[属性1=属性値][属性2=属性値]」。
# 选择id属性为kw并且name属性为wd同时class属性为s_ipt的input元素
driver.find_element(By.CSS_SELECTOR, "input[id = 'kw'][name = 'wd'].s_ipt")
n 番目の子(n) と n 番目の最後の子(n)
(逆数の) n 番目の子要素を見つけます。は、このタグの n 番目ではなく、すべての子要素の n 番目です。位置がラベルと一致しない場合、位置を特定することはできません。
# 选择父元素class属性为s-top-left-new s-isindex-wrap的第二个子元素a
driver.find_element(By.CSS_SELECTOR, "[class='s-top-left-new s-isindex-wrap']>a:nth-child(2)")
8、xpath の配置による
1. 絶対パス
HTML ルート ノードからレイヤーごとに検索すると、パスは一意になります。ページのコード構造がわずかに変更されただけであっても、元の有効な xpath 位置決め式が失敗する可能性があります。一般的には推奨されません。
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input')
2. 相対パス
HTML ページ全体の位置に関係なく、現在のノードから検索します。通常、ページ構造の変更による影響は受けません。
driver.find_element(By.XPATH, "//*[@id='kw']")
3. 共通の xpath
表現 | 説明 | 例 |
---|---|---|
/ | ルート ノードから選択します (子ノードを取得します)。単純に絶対パスとして理解されます。 | /html/body/div[1]/div[1] |
// | 位置に関係なく、選択内容に一致する現在のノードからドキュメント内のノードを選択します (子孫を取得します)。単に相対パスとして理解されます。 | //入力/div//スパン |
。 | 現在のノードを選択します。 | |
.. | 現在のノードの親ノードを選択します。 | //入力/.. |
@ | プロパティを選択します。 | //@lang |
* | 任意のノードまたは任意の属性を表すワイルドカード | //* |
属性の配置
属性名「//ラベル名[@attribute='属性値']」で直接検索します。
driver.find_element(By.XPATH, "//input[@name='wd']")
文章()
ラベル内のテキストの配置により、「//ラベル名[text()='テキストコンテンツ']」となります。
driver.find_element(By.XPATH, "//a[text()='hao123']")
を含む()
ファジー配置。属性の値の一部を使用して配置します。
"//ラベル名 [contains(@attribute, '属性値')]", "//ラベル名 [contains(text(), 'テキストコンテンツ')]"
# 都是定位到百度主页下的hao123
driver.find_element(By.XPATH, "//a[contains(@href, 'src=from_pc')]")
driver.find_element(By.XPATH, "//a[contains(text(), 'hao')]")
論理的な位置付け
複数の属性タグでターゲットを設定します。連結には論理演算子「and、or、not」を使用します。
"//タグ名[@attribute='属性値'および/または@attribute='属性値']", "//タグ名[not(@attribute='属性値')]"
# 都是定位到百度主页下的搜索输入框
driver.find_element(By.XPATH, "//input[@id='kw' or @name='wd']")
driver.find_element(By.XPATH, "//input[not(@id='xx') and @name='wd']")
位置()
親要素のすべての子要素に配置されるラベルの位置を選択します。(逆数。
「タグ名[n]」、「タグ名[last()-n]」、「タグ名[position()=n]」。last() は最後のもので、last()-1 は最後から 2 番目のものです。
Position() 最初の 2 つと比較すると、最初のいくつかまたは最後のいくつかの範囲の位置決めに「<、>」などの記号を使用できます。
# 都是定位到百度主页下的hao123
driver.find_element(By.XPATH, "//div[@id='s-top-left']/a[2]")
driver.find_element(By.XPATH, "//div[@id='s-top-left']/a[last()-5]")
driver.find_element(By.XPATH, "//div[@id='s-top-left']/a[position()=2]")