seleniumを利用してアクセスしたwebページ内で、複数指定したxpath/class/tagのいづれか一つが該当した場合に、
要素を取得してリストに格納することにトライしています。
自分で色々調べながら試してみましたが
条件分岐の箇所が上手くいかず、複数の結果がリストに格納されてしまいます。
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException import time driver = webdriver.Chrome() listX = [] driver.get('http://www.hoge.com') time.sleep(1) search_box = driver.find_element_by_name('q') search_box.send_keys('キーワード') search_box.submit() try: listX.append(driver.find_element_by_xpath('//div/div[3]/div/div/span[2]').text) driver.back() try: listX.append(driver.find_element_by_xpath('//div/div[4]/div/div/span[2]').text) driver.back() except NoSuchElementException: listX.append('no data') driver.back() except NoSuchElementException: listX.append('no data') driver.back() 結果:['赤','no data']
プログラミング初心者のため、稚拙な質問になるかもしれませんが、ご教示いただけましたら幸甚でございます。
何卒よろしくお願い申し上げます。
「複数指定したxpath/class/tagのいづれか一つ」とありますがこれはどういう意味でしょうか。プログラムにはxpathしかないように見えます。
また、「複数の結果がリストに格納されてしまいます」とありますが、一つしか結果を求めていないならなぜリストに格納をするのでしょうか。
仕事などで使っていると難しいかもしませんがDOMをいただければすぐにご回答できますよ。
お返事ありがとうございます。
例では2種類のxpathを記載しておりますが、xpathに限らず複数の候補要素を指定してして、
いずれかの要素が該当した場合にのみ、リストに格納したいと考えています。
複数要素指定している理由は、表示されるページによってxpathがズレてしまうことと、
私が要素指定に不慣れなためです。
複数格納されてしまうのは、2つの要素の両方とも該当する場合、リストに2つの要素が格納されてしまいます。
DOMが下記のような2種類存在する場合を想定した処理を行いたいと考えています。
//*[@id="rhs_block"]/div[1]/div[1]/div/div[1]/div/div[4]/div/div/span[2]/a
//*[@id="tsuid31"]/div[1]/div/div[4]/div/div/span[2]/a
欲しい部分のhtml要素はアクセスするたびに何パターンかに変化するということですかね。
全パターンのhtml要素全部いただけないでしょうか。
そもそもこのように頻繁に変わるパターンのDOM相手に長めのxpathを使うのはナンセンスです。
何かしらいい方法があると思いますが、前後含めてhtml要素を見てみないことには完璧な回答はし難いです。