Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【Python Selenium】要素の親要素を取得する方法(SeleniumVer4.6以降)

 

pythonseleniumで要素の取得をする場合は、find_element、またはfind_elementsで取得できます。

find_elementの場合は、たとえば以下のようになります。

 

element = driver.find_element(By.NAME, "tagname")

 

このようにして取得した要素elementから1階層上の要素(親要素)を取得したいような場合があるかと思います。

そのような場合にはxpathを使用して以下のようにします。

 

element.find_element(By.XPATH, "..")

 

同様に、2階層上の要素を取得するような場合には以下のようにします。

 

element.find_element(By.XPATH, "../..")

 

以下にChromeの場合の例を載せておきます。

 

SeeleniumではバージョンによってWebドラーバーの設定方法が異なりますが、例として載せている内容はSelenium ver.4.6以降の場合の例となります。

 

Selenium ver.4.6以降の場合)

from selenium import webdriver
selenium.webdriver.common.by import By

 # ドライバー指定でChromeブラウザを開く
driver = webdriver.Chrome()  
driver.get('https://**********.***/')
#子要素の名前を「abcdef」とした場合の指定例 child_element = driver.find_element(By.NAME, "abcdef")

#1階層上の親要素を指定して要素取得
parent_element = element.find_element(By.XPATH, "..")

# タブを閉じる driver.close() driver.quit()

 

同様にEdgeの場合は以下になります。

4行目のWebドライバーの設定の箇所が違うだけです。

 

(Selenium ver.4.6以降の場合)

from selenium import webdriver
selenium.webdriver.common.by import By

 # ドライバー指定でChromeブラウザを開く
driver = webdriver.Edge()
driver.get('https://**********.***/')
#子要素の名前を「abcdef」とした場合の指定例
child_element = driver.find_element(By.NAME, "abcdef")

#1階層上の親要素を指定して要素取得
parent_element = element.find_element(By.XPATH, "..")

# タブを閉じる driver.close() driver.quit()

 

上記例では、

 

2行目までで必要なライブラリのインポートを行っています。

 

4行目はChrome用またはEdge用のドライバー設定となります。

 

このdriverを使用して、5行目でdriver.getの後にオープンしたいURLを指定することで画面を開いています。

 

その後、7行目で要素の名前が「abcdef」という子要素を探索して「child_element」に設定しています。

 

9行目で1階層上の親要素を指定して要素取得し「parent_element」に設定しています。

 

11、12行目で開いたウインドウを閉じて終了させています。

 

尚、SeleniumVer4.6以前の場合はドライバー設定の方法が違い上記ではエラーとなります。この場合の使用例については以下などに載せています。

 

kuku81kuku81.hatenablog.com

 

 

以上がSeleniumで、ある要素の親要素を取得する方法になります。

 

【Python Selenium】セレクトタグのオプションをテキストを指定して選択する方法(SeleniumVer4.6以降)

今回もPythonでseleniumを利用してセレクトタグのオプションを選択する方法についての説明になります。

 

これまでにセレクトタグで各オプションのインデックス番号からオプションの選択をする方法は記載していますが、今回は表示テキストにより選択する方法の説明です。

 

 

 

 

1.選択方法

 

セレクトタグで表示テキストからオプションの選択を行う場合には、セレクト要素に対してselect_by_visible_text()を使用します(以下参照)。

 

select.select_by_visible_text()

 

 

以下にChromeの場合の例を載せておきます。

 

SeeleniumではバージョンによってWebドラーバーの設定方法が異なりますが、例として載せている内容はSelenium ver.4.6以降の場合の例となります。

 

Selenium ver.4.6以降の場合)

from selenium import webdriver
from selenium.webdriver.support.select import Select
selenium.webdriver.common.by import By # ドライバー指定でChromeブラウザを開く
driver = webdriver.Chrome()  
driver.get('https://**********.***/')
#セレクトタグの名前が「abcdef」とした場合の指定例 element = driver.find_element(By.NAME, "abcdef")
#セレクトタグの要素を指定してSelectクラスのインスタンスを作成
select = Select(element)

#テキストを設定
text = "abcdef"
#セレクトタグのオプションをテキストを指定して選択
select.select_by_visible_text(text)
# タブを閉じる driver.close() driver.quit()

 

同様にEdgeの場合は以下になります。

5行目のWebドライバーの設定の箇所が違うだけです。

 

(Selenium ver.4.6以降の場合)

from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By # ドライバー指定でEdgeブラウザを開く
driver = webdriver.Edge()

driver.get('https://**********.***/')

#セレクトタグの名前が「abcdef」とした場合の指定例
element = driver.find_element(By.NAME, "abcdef")

#セレクトタグの要素を指定してSelectクラスのインスタンスを作成
select = Select(element)

#テキストを設定
text = "abcdef"

#セレクトタグのオプションをテキストを指定して選択
select.select_by_visible_text(text)

# タブを閉じる driver.close() driver.quit()

 

上記例では、

 

3行目までで必要なライブラリのインポートを行っています。

 

5行目はChrome用またはEdge用のWebドライバー設定となります。

 

このdriverを使用して、6行目でdriver.getの後にオープンしたいURLを指定します(上記例では********.***指定)。

 

その後、8行目で画面内でnameが「abcdef」というセレクトタグの要素を探索して「element」に設定しています。

 

10行目でセレクトタグの要素を指定してSelectクラスのインスタンスを作成しています。

 

12行目でテキストを指定し、14行目でSelectクラスのインスタンスに対してselect_by_visible_text(text)でテキストを引数として渡してセレクトタグのオプションを選択しています。

 

尚、Selenium ver.4.6以前の場合については以下の記事に載せています。

Webドライバーの設定が違うだけですが。

 

kuku81kuku81.hatenablog.com

 

 

以上がセレクトタグのオプションを表示テキストから選択する方法の説明と簡単な例になります。

 

 

【Python Selenium】セレクトタグのオプションをインデックス番号から選択する方法(SeleniumVer4.6以降)

Pythonでseleniumを利用してセレクトタグのオプションを選択する方法についての説明になります。

 

セレクトタグでは各オプションの表示テキストやインデックス番号からオプションの選択ができますが、今回はインデックス番号により選択する方法の説明です。

 

 

 

 

1.選択方法

 

セレクトタグでインデックス番号からオプションの選択を行う場合には、セレクト要素に対してselect_by_index()を使用します(以下参照)。

 

select.select_by_index() 

 

 

以下にChromeの場合の例を載せておきます。

 

以下は、selenium ver.4.6以降の場合の例になります。

それ以前とはWebドライバーの指定が異なります。

 

selenium ver.4.6以降の場合)

from selenium import webdriver
from selenium.webdriver.support.select import Select
selenium.webdriver.common.by import By # ドライバー指定でChromeブラウザを開く
driver = webdriver.Chrome()  
driver.get('https://**********.***/')
#セレクトタグの名前が「abcdef」とした場合の指定例 element = driver.find_element(By.NAME, "abcdef")
#セレクトタグの要素を指定してSelectクラスのインスタンスを作成
select = Select(element)

#インデックス番号を指定
indexNum = 1

#セレクトタグのオプションをインデックス番号から選択
select.select_by_index(indexNum)
# タブを閉じる driver.close() driver.quit()

 

同様にEdgeの場合は以下になります。

5行目のドライバーの設定の箇所が違うだけです。

 

from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By # ドライバー指定でEdgeブラウザを開く
driver = webdriver.Edge()

driver.get('https://**********.***/')

#セレクトタグの名前が「abcdef」とした場合の指定例
element = driver.find_element(By.NAME, "abcdef")

#セレクトタグの要素を指定してSelectクラスのインスタンスを作成
select = Select(element)

#インデックス番号を指定
indexNum = 1

#セレクトタグのオプションをインデックス番号から選択
select.select_by_index(indexNum)  

# タブを閉じる driver.close() driver.quit()

 

上記例では、

 

3行目までで必要なライブラリのインポートを行っています。

 

5行目はChrome用またはEdge用のドライバー設定となります。

 

このdriverを使用して、6行目でdriver.getの後にオープンしたいURLを指定します(上記例では********.***指定)。

 

その後、8行目で画面内で検索キーワード入力窓の要素を探索して「element」に設定しています。

 

10行目でセレクトタグの要素を指定してSelectクラスのインスタンスを作成しています。

 

12行目でインデックス番号を指定し、14行目でSelectクラスのインスタンスに対してselect_by_index(indexNum)でインデックス番号を引数として渡してセレクトタグのオプションを選択しています。

 

尚、selenium ver.4.6以前の場合については以下にて記載しています。

Webドライバーの指定が異なるだけですが。

 

kuku81kuku81.hatenablog.com

 

 

以上がセレクトタグのオプションをインデックス番号から選択する方法の簡単な例になります。

 

 

 

 

 

 

【Python Selenium】要素に入力された値をクリアする方法(SeleniumVer4.6以降)

Pythonでseleniumを利用して要素に入力処理を行う場合はsend_keys()などを使用しますが、今回は入力した値をクリアする方法になります。

 

 

 

 

1.要素の値をクリアする方法

 

通常入力した値をクリアする場合にはclear()を使用します。

 

値をクリアしたい要素を洗い出してその要素に対してclear()処理を実行すれば要素内の値はクリアされます。

 

要素に入力された値をクリアする簡単な例としてGoogle検索画面にアクセスして、キーワード入力後、その値をクリアするような例を載せておきたいと思います。

 

Chromeの場合の例が以下になります。

 

selenium ver.4.6以降の場合)

from selenium import webdriver
from selenium.webdriver.common.by import By

# ドライバー指定でChromeブラウザを開く
driver = webdriver.Chrome() 

driver.get('https://www.google.com/') element = driver.find_element(By.NAME, "q") #検索テキストボックスに"abc"を入力 element.send_keys("abc") #入力された"abc"をクリア
element.clear() # タブを閉じる driver.close() driver.quit()

 

同様にEdgeの場合は以下になります。

4行目のドライバーの設定の箇所が違うだけです。

 

(selenium ver.4.6以降の場合)

from selenium import webdriver
from selenium.webdriver.common.by import By

# ドライバー指定でEdgeブラウザを開く
driver = webdriver.Edge()
driver.get('https://www.google.com/') element = driver.find_element(By.NAME, "q") #検索テキストボックスに"abc"を入力 element.send_keys("abc") #入力した値"abc"をクリア element.clear() # タブを閉じる driver.close() driver.quit()

 

上記例では、

 

2行目までで必要なライブラリのインポートを行っています。

 

4行目はChrome用またはEdge用のドライバー設定となります。

 

このdriverを使用して、5行目でdriver.getの後にオープンしたいURLとしてGoogle検索画面のURLを指定することで検索画面を開いています。

 

その後、6行目で画面内で検索キーワード入力窓の要素を探索して「element」に設定しています。

 

8行目でsend_keysに検索用のキーワード「abc」を引数として渡すことで検索窓にキーワードを入力しています。

 

10行目のelement.clear()で入力した値「abc」をクリアしています。

 

12、13行目で開いたウインドウを閉じて終了させています。

 

これにより、Google検索画面を表示しキーワード入力後にクリア処理をして、ウインドウを閉じて終了するまでの一連の流れができることになると思います。

 

尚、SeleniumVer4.6以前の場合はドライバー設定の方法が違い上記ではエラーとなります。この場合の使用例については以下などに載せています。

 

kuku81kuku81.hatenablog.com

 

 

 

以上が要素に入力された値をクリアする方法になります。

 

【Excel】Excelで図形の位置がずれる時の対応方法

 

Excelで丸や四角などの図形を描いてファイル作成した時に、他のPCに送って開いてみると表示位置がずれる時がありました。

 

PCによってずれるPCとずれないPCがあるということではじめは原因がよくわからなかったのですが、いろいろと調べていく中で原因が判明したことがありましたので備忘録として書き残しておきます。

 

今回の場合、原因は「ディスプレイの設定」の拡大縮小の倍率設定でした。

 

以下は、Windows11の場合の設定画面ですが、この中の「拡大/縮小」欄の倍率がずれないPCとずれるPCで異なっていたというものでした。

 

具体的には、ExcelVBAで図形作成していたのですが、「拡大/縮小」欄の倍率が100%設定のPCで図形を所定の位置に合うように作成するように作っていたプログラムを「拡大/縮小」欄の倍率が150%設定の別PCに持って行って同じプログラムを実行したところ作成された図形の位置がずれたというものです。

 

ディスプレイの設定(拡大縮小倍率)

ディスプレイの設定(拡大縮小倍率)

 

今回の場合は結果的にはこの設定をあわせることで解決しました。

 

図形の位置がずれるような時の対応方法として他には、位置を指定する時の指定の仕方で絶対座標指定かセル指定かというまのなどあるようなのですが、それではうまくいかず結果的にはこれでという内容です。

 

以上が、Excelで図形の位置がずれる時の原因と対応方法の例になります。

 

【Python Selenium】セレクトタグ(Select要素)のすべてのoptionを取得する方法(SeleniumVer4.6以降)


Seleniumを使用してセレクトタグ(要素)にアクセスする場合には操作したり状態取得できることがいろいろとありますが、セレクトタグの選択する要素であるすべてのoptionを取得したいということもあるのではないかと思います。

 

 

 

 

1.セレクトタグのoption取得方法

 

セレクトタグのすべてのoptionを取得する場合には、

 

select.options()

 

を使用します。

 

以下に、Chromeにて、とあるセレクトタグのすべてのoptionを取得して各optionのテキストを印字するコード例を載せておきます。

(以下の例の中の「os.getcwd()」はカレントディレクトリを指しますのでChrome用のドライバーchromedriver.exeは同じフォルダ(カレントディレクトリ)に入れた状態で実行します)

 

selenium ver.4.6以降の場合)

from selenium import webdriver
from selenium.webdriver.common.by import By

######################################################################
driver = webdriver.Chrome() ######################################################################
#指定したURLに画面展開(指定したURL:************) driver.get('************')

#要素をid番号から取得(idがabsdefのセレクトタグ)
element = driver.find_element(By.ID, "abcdef");
#Selectクラスのインスタンスを生成
select = Select(element)
#セレクトタグ内のオプションを全て取得
selOptions = select.options
#セレクトタグ内の各オプションのテキストをprint印字
for i in range(len(selOptions)):
  print(selOptions[i].text)

 

 

また、ドライバーの設定方法の違いだけになりますがSelenium ver.4.6以前の場合の例は、以下に載せています。

kuku81kuku81.hatenablog.com

 

 

以上が、セレクトタグ(Select要素)のすべてのoptionを取得する方法になります。

 

 

 

【Python Selenium】PythonとSeleniumでXPathを使ってWebスクレイピングをしよう!(SeleniumVer4.6以降)


今回はPythonSeleniumを使って、Webスクレイピングの強力なテクニックであるXPathについて紹介します。

 

XPathはHTML要素を特定するための強力な言語であり、Webページからデータを抽出するのに役立ちます。

 

では、具体的な例を交えてXPathの使い方を紹介していきましょう。

 

 

 

目次

 

 

1.XPathとは?

 
 
XPathは、XML文書(HTMLも含む)内の要素や属性を指定するためのパス言語です。
XPathを使用することで、要素の階層関係や属性を使って、特定の要素を簡単に特定できます。
Webスクレイピングの際に、XPathは特に便利です。
 
XPath(XML Path Language)はHTML/XMLの要素や属性値をカンタンな構文で表現する言語ということになります。
 
XPathではHTMLなどの階層構造を'/'(スラッシュ)を使って表します。

 

たとえば、//h1はドキュメント内のすべての<h1>要素を選択しますし、

//div[@class='content']はclass属性がcontentであるすべての<div>要素を選択します。

 
 

2.階層構造の表現例

 
また、以下のようなHTMLドキュメントの階層構造は、

 

<!DOCTYPE html>
<html>
  <body>
      <h1>Python selenium</h1>
      <p>スクレイピング</p>
      <h2>
          <a href="https://www.google.com/">検索サイト</a>
        </h2>
    </body>
</html>

 
このようになります。
 

  HTMLの階層構造

 

 

これについて、この中のaタグをXPathで表現すると、
 
/html/body/h2/a
 
となります。
 
このように、XPathを使用すると、HTMLやXMLの要素、属性値を簡単な構文で表現できます。
 
 

3.Chromeデベロッパーツールを使ってXPathを見つける方法

 
 

XPathを正確に記述するには、まず対象となる要素を特定する必要があります。

 

Google Chromeのデベロッパーツールを使ってXPathを見つける方法を紹介します:

Webページで右クリックして、「検証」を選択します。

 

デベロッパーツールが表示されたら、Ctrl + F(またはMacの場合はCmd + F)を押して検索バーを開きます。


XPathを見つけたい要素のHTMLコードを右クリックし、「Copy」から「Copy XPath」を選択します。

 
 

4.Seleniumを使用したXPath指定での要素の取得

 
(1)指定した要素を1つだけ取得する場合には、
 
  driver.find_element(By.XPATH, value=指定したXPath)
 
のようにfind_element()を使用します
 
 
 
(2)同様に、指定した要素を複数取得する場合には、
 
  driver.find_elements(By.XPATH, value=指定したXPath)
 
のようにfind_elements()を使用します。
 
 
 
(3)属性名と属性値で属性指定して条件をつけて取得する場合には、
 
  driver.find_element(By.XPATH, value="//タグ名[@属性名=属性値]")
 
のような書式で記載します。
 
 
 
 たとえば、一例として、Gogle検索窓をXPath指定にて要素取得し、その窓に"abc"と入力し検索実行(Enterキークリック)するような例は以下のようになります。

 

(selenium ver.4.6以降の場合)

from selenium import webdriver
from selenium.webdriver.common.by import By

######################################################################
driver = webdriver.Chrome() ######################################################################

#指定したURLに遷移する
driver.get("https://www.google.co.jp")

#Google検索窓をxpath指定し要素取得
xpath = "//textarea[@class='gLFyf']"
element = driver.find_element(By.XPATH, value=xpath)

#検索窓に"abc"と入力
element.send_keys("abc")
#Enterキークリック
element.submit()

# タブを閉じる
driver.close()
driver.quit()
 
 
(4)ここで、先程の書式に対してタグ名を*にすると、すべてのタグ名に対して属性指定して取得することができます。
具体的には、
 
  driver.find_element(By.XPATH, value="//*[@属性名=属性値]")
 
のような書式で記載します。
 
 
(5)さらに属性名も*にすると、すべてのタグ名、属性名に対して属性指定して取得することになります。
書式は、
 
  driver.find_element(By.XPATH, value="//*[@*=属性値]")
 
のようになります。
 
 
(6)タグ内のテキストを指定して要素を取得する場合には、
 
  driver.find_element(By.XPATH, value="//*[text()=指定する文字列]")
 
のような書式で記載します。
 
 
(7)複数の条件を指定して要素を取得する場合には、
 
  driver.find_element(By.XPATH, value="//*[条件1 and 条件2]")
 
  driver.find_element(By.XPATH, value="//*[条件1 or 条件2]")
 
のような書式で記載します。
 
 
(8)抜き出した要素のn番目の要素を取得する場合には、
 
  driver.find_element(By.XPATH, value="//*[position()=n]")
 
のような書式で記載します。
 
 
上記(7)、(8)の一例として、先程の例のコードのxpath指定の箇所に複数条件と順番指定を兼ねて、
 
  and position()=1
 
を追加してみると以下のようになります。
(実行した結果は先程と同じになります)
 
(selenium ver.4.6以降の場合)
from selenium import webdriver
from selenium.webdriver.common.by import By

######################################################################
driver = webdriver.Chrome() ######################################################################

#指定したURLに遷移する
driver.get("https://www.google.co.jp")

#Google検索窓をxpath指定し要素取得
xpath = "//textarea[@class='gLFyf' and position()=1]"
element = driver.find_element(By.XPATH, value=xpath)

#検索窓に"abc"と入力
element.send_keys("abc")
#Enterキークリック
element.submit()

# タブを閉じる
driver.close()
driver.quit()
 
 
また、ドライバーの設定方法の違いだけになりますがSelenium ver.4.6以前の場合の例は、以下に載せています。
 
以上が、PythonとSeleniumを使ってXPathを活用する基本的な方法です。

 

XPathは非常に強力なツールであり、Webスクレイピングの幅を広げるのに役立ちます。

それでは、XPathを使ってデータを効率的に収集する楽しさを味わってください!

成功を祈っています!