2016-10-02 6 views
1

この時点でセレンの知識は少し限られていますが、私がdriver.find_elements_by_xpath()がweb要素のリストを返すと理解しています。次に、要素を繰り返し処理し、テキストを印刷するなど、必要な処理を実行できます。 その部分は簡単です。 しかし、今、私は3つのノードのすべての組み合わせを探していることになる特定のページに想定しています(ここではH1、クラスでdiv要素、およびH3)セレンの1つのWeb要素で同じレベルのノードの組み合わせを返すにはどうすればよいですか?

<parent> 
    <h1>text</h1> 
    <div class="identifier">more stuff</div> 
    <h3>text2</h3> 
    <h1>other text</h1> 
    <div class="identifier">other more stuff</div> 
    <h3>other text2</h3> 
    ... 
</parent> 

これらの3つのノードは、階層の同じレベルにあるとありますそのリストの以来、多くの人がそこにいます。セレンがそれらを「パッケージ化」して返す方法がありますか?この場合、私は一緒に正しいデータを取得することができます。私が今やっているやり方は、中間の要素を取得してから、指定されたタグで兄弟を前後することです。しかし、私は気分が最高だと思う。

Thx alot。

+1

これを行う最善の方法は、親要素をこれらの兄弟要素に参照することです。あなたは周囲のHTMLのいくつかを投稿できますか? Seleniumを使用してこれらのパッケージ化されたストレートを単一のfindから返すことはできませんが、親要素を取り、これら3つの要素のコレクションを「パッケージ」として返す関数を書くことができます。 – JeffC

+0

Thx Jeff。私もそう思っていました。しかし、1つの問題があります。唯一の親には、私の3つのノードの組み合わせの束が含まれています。私は説明を更新しました。あなたの質問に十分答えましたか? –

答えて

1

私はあなたのアプローチにどのようなコードを使用しているのか分かりませんが、このようなことをします。

headings = driver.find_elements_by_css_selector("parent > h1")) 
for i in range(len(headings)): 
    heading = driver.find_element_by_css_selector("parent > h1:nth-of-type(" + i + ")")) 
    identifier = driver.find_element_by_css_selector("parent > div.identifier:nth-of-type(" + i + ")")) 
    subheading = driver.find_element_by_css_selector("parent > h3:nth-of-type(" + i + ")")) 
    // do something with each element here 

ここで、各要素を参照できます。

注:これは、各要素が常に存在することを前提としています。 h3などが見つからない場合は、このコードはグループを不一致にします。

+0

あなたのコメントのおかげで、私は非常にシンプルなことをやっています。私の懸念はまさにあなたが指摘したことですが、私はその問題を解決するためにセレンに機能性が組み込まれていないと思います。 –

+0

h1s、div.identifier、およびh3の数がすべて等しいことを確認するループの前に検証を追加できます。そうでない場合は、エラーをスローするか、何かがオフになることを知らせるために何かを投げてください。その時点で、私はあなたが何をするのか分かりません。私は自分自身のためにいくつかのアプローチを思いつくためにHTMLを見なければならないだろう。 – JeffC

+0

ええ、それは私がやったことはかなりです。私のアプローチをバックアップしてくれてありがとう。 Offtopic:css_selectorsを使ってどこにあなたを見た。私はこれまでほとんどXPathを使用してきました。私はいくつかの再探索を行い、それを使用しない魅力的な理由を見つけることができませんでした(まったく逆です:例えば、 "contains"はcss_selectorsで動作しません)。 –

0

あなたのアプローチはうまくいきます。最初の要素を見つけて、次の要素が期待どおりであることを確認してください。

このような複雑なケースでは、本文としてのHTMLをテキストとして取り出し、(より強力な)正規表現を実行する方が簡単かもしれません。

+1

あなたは本当に、本当に、正規表現のHTMLをしたくありません。私はロケータができないこの場合に正規表現が何をするのか分からない。正規表現は本当に複雑で壊れやすいでしょう。 – JeffC

+0

すべての問題について正規表現で解決しようとすると、彼は2つの新しいもので終わります:) –

関連する問題