2020-03-03

複数の要素をリストで取得する - selenium - python

同じタグ名の要素や、同じ属性値の要素をリスト型でまとめて取得する。
html内のリスト形式になっている部分の取得や、要素を単独で指定しずらい場合などに便利。

・複数の要素を取得

YAHOOのトップページにある <ul> タグの要素を全て取得してみる。
(<ul>タグはhtml内のリスト表示の部分の親要素)

XPathで書くと //ul
これを .find_elements_by_xpath() で指定して取得する。
※「_elements_」の部分が複数形になっていることに注意。
from selenium import webdriver
 
brows = webdriver.Chrome()
 
brows.get( 'https://www.yahoo.co.jp/' )
 
elements = brows.find_elements_by_xpath( '//ul' )

print( type(elements) )    #type()で型を確認

#出力
# <class 'list'>


for.get_attribute() を使って各要素の属性「aria-label」を見てみる。
属性の取得についてはこちら ⇒
from selenium import webdriver
 
brows = webdriver.Chrome()
 
brows.get( 'https://www.yahoo.co.jp/' )
 
elements = brows.find_elements_by_xpath( '//ul' )

for e in elements:
    print( e.get_attribute('aria-label') )

#出力
# None
# None
# None
# None
# お知らせ
# 主なサービス
# None
# None
# None
# Yahoo!ニュースのカテゴリ
# None
# None
# あなたのステータス
# None
# None
# None
# スコアボードのカテゴリ
# None
# None
# None
# None
# None
# None


属性 aria-label="主なサービス" を持つ<ul>タグは、
YAHOOトップページの左のリスト部分にあたる。


さらに if を使って、このリスト部分のリンク一覧を取得してみる。
from selenium import webdriver

brows = webdriver.Chrome()

brows.get( 'https://www.yahoo.co.jp/' )

elements = brows.find_elements_by_xpath( '//ul' )

for e in elements:
    if e.get_attribute( 'aria-label' )=='主なサービス':
        #この<ul>タグ内の全ての<a>タグを取得
        elements2 = e.find_elements_by_xpath( './/a' )
        for e2 in elements2:
            print( e2.text )    #テキスト
            print( e2.get_attribute('href') )   #リンク先
            print( '------------' )

#出力
# ショッピング
# https://shopping.yahoo.co.jp/?sc_e=ytc
# ------------
# PayPayモール
# https://paypaymall.yahoo.co.jp/?sc_e=ytc
# ------------
# ヤフオク!
# https://auctions.yahoo.co.jp/
# ------------
# PayPayフリマ
# https://app.adjust.com/1kmi1m2?redirect=https%3A%2F%2Fpaypayfleamarket.yahoo.co.jp%2F%3Fcpt_s%3Dytopmedia%26cpt_m%3Dkotei%26cpt_n%3Dcontent%26cpt_c%3Dytopmedia
# ------------
# #以下略


※取得した要素からさらに .find_elements_by_xpath() を使う場合、
 XPathは . (コンマ)から始める。

0 件のコメント:

コメントを投稿