質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

1660閲覧

XPathがページによって異なる場合の、同じ値の繰り返しの取得について質問です

ama178

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2022/10/22 06:15

前提

アリエクスプレスというサイトの商品ページが在庫切れになっていないかどうかをチェックするプログラムを作りたいです。
エクセルのA列にアリエクスプレスのURLがズラッと並んでいて、
それらが在庫切れになっていないかをチェックするプログラムです。
情報の取得に失敗した場合に隣のB列の同じ行に「在庫切れ」と入力します。(成功したときは「在庫あり」と入力します)

問題はXPathでの要素の取得で躓いていて、商品ページの価格の部分を取得したいのですが、
例えば、セール中の商品とそうでない商品によってXPathが若干変わったりします。(人間からしたら同じ場所であっても)
こういう場合はどうやって要素を取得すれば良いのでしょうか?

該当のソースコードは論理演算子のorを使って、
「XPathのパターン1」or「XPathのパターン2」
という書き方をして、どちらかが取得できれば「在庫あり」を入力するように作りました。
しかし実行してみると、どちらかのXPathが取得できないとエラーになってしまいます。

サンプルの商品ページを載せておきます。

https://ja.aliexpress.com/item/1005004115273699.html?spm=a2g0s.8937460.0.0.39be2e0ecoqFRv&gatewayAdapt=glo2jpn

https://ja.aliexpress.com/item/32956414357.html?spm=a2g0s.8937460.0.0.41842e0e2DHeYq&gatewayAdapt=glo2jpn

価格の部分のXPathですが、
上のページのXPathが「//[@id="root"]/div/div[2]/div/div[2]/div[5]/div[1]/span」
下のページのXPathが「//
[@id="root"]/div/div[2]/div/div[2]/div[4]/div[1]/span[1]」
となっています。

発生している問題・エラーメッセージ

実行時エラー7 no such element error

該当のソースコード

vba

1Sub test() 2 3Dim Driver As New Selenium.WebDriver 4Dim i As Long 5 6SafeOpen Driver, Chrome 7 8With ThisWorkbook.Worksheets("test") 9 10For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row 11 12 Driver.Get .Range("A2").Offset(i - 1, 0) 13 14 If Driver.FindElementByXPath("//*[@id=""root""]/div/div[2]/div/div[2]/div[4]/div[1]/span").Text Or Driver.FindElementByXPath("//*[@id=""root""]/div/div[2]/div/div[2]/div[5]/div[1]/span").Text Then 15 16 Worksheets("test").Cells(1 + i, 2) = "在庫あり" 17 18 Else 19 20 Worksheets("test").Cells(1 + i, 2) = "在庫切れ" 21 22 End If 23 24Next 25 26End With 27End Sub 28

試したこと

上記のコード以外で試したことは、

「Aの要素取得をする
これが無理ならBの要素取得をする
それもダメなら在庫切れ」

という動きをどうやって実装すればいいか考えてIF else文を試しましたが、実行時エラーが出てしまいました。

他にはエラー処理の「Resumeステートメント」を使えばいいと考えたのですが、
調べて出てくる情報が初心者には分かりづらいものばかりで、まだ使い方がよく理解できていない状況です。

Aの要素取得

エラーがでた場合Bの要素取得

それでもエラーがでた場合は在庫切れ

AかBの要素取得に成功した場合は在庫あり

という形にすれば動かせそうに思うのですが、調べが足りてないです。

また、XPath以外のセレクターでの取得も試みました。
class name で取得しようとしたのですが、
driver.FindElementByClass~ の「~」の部分に何を入れれば良いのかが分かりませんでした。
デベロッパーツールでクラス名のコピーの選択肢が存在しないです。
HTMLからどの部分を抜き取って入れれば良いのかが分かりませんでした。

いろいろ試しましたが全て上手くいかず困っています。
どの方法が最も良いのかご教授していただけるとありがたいです。

補足情報(FW/ツールのバージョンなど)

Windows10
chrome

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

例えば、セール中の商品とそうでない商品によってXPathが若干変わったりします。(人間からしたら同じ場所であっても)こういう場合はどうやって要素を取得すれば良いのでしょうか?

XPathが変わるというか、HTMLの記述が変わると言うことですよね。
一般論ですが、人間がHTMLを見て、「ここだ」と判断できるのであれば、その人間の判断を言語化して、それをコードにします。
XPathだけで実現できればそれでいいし、XPathだけで実現できない場合は、XPathで多めに抽出してその中からプログラムロジックで選びます。
何らかのテキスト文字列がキーになることが多いです。そうでない場合も多いですが。

例えば、このページの「リアクションを追加」というボタンを押したければ、1つの方法としては、直下のテキストがリアクションを追加であるspanの親の親のbuttonです。他にも特定方法はあると思いますが。
//span[text()='リアクションを追加']/../..

という動きをどうやって実装すればいいか考えてIF else文を試しましたが、実行時エラーが出てしまいました。

方法は2通りあって、
FindElementBy~~がエラーになれば無いと判断。お書きのon error resume nextを使う方法。
FindElementBy~~じゃなくて、FindElementsBy~~で配列(VBAだとコレクションかな)で結果を得て、要素数が0個だと無いと判断。配列で取得する場合は0件でもエラーにならないはず。

投稿2022/10/22 10:38

otn

総合スコア86293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ama178

2022/10/22 15:03

前の質問に続いてご回答いただきありがとうございます。 頂いた情報を元にまたやってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問