web-dev-qa-db-ja.com

セレン:要素のグループを反復する

BeautifulSoupを使用してこれを実行しましたが、少し面倒です。Seleniumで直接実行できるかどうかを考えています。

次のHTMLがあるとします。これは、ページのソースで、同じ要素で内容が異なる複数回繰り返されます。

<div class="person">
    <div class="title">
        <a href="http://www.url.com/johnsmith/">John Smith</a>
    </div>
    <div class="company">
        <a href="http://www.url.com/company/">SalesForce</a>
    </div>
</div>

各人のエントリが次のようになる辞書を作成する必要があります。

dict = {'name' : 'John Smith', 'company' : 'SalesForce'}

次のようにすることで、Seleniumに各最上位要素のコンテンツのリストを簡単に作成させることができます。

driver.find_elements_by_class_name('person')

しかし、上記の方法ではスコープ/ソースをその要素のコンテンツのみに限定しないため、リストを反復処理することはできません。

私がこのようなことをやろうとすると:

people = driver.find_elements_by_class_name('person')
for person in people:
    print person.find_element_by_xpath['//div[@class="title"]//a').text

私は何度も何度も同じ名前を取得します。

私の場合、ページ全体を繰り返し処理し、各タグを個別に追加することが機能しないため、グループごとにこれを行う必要があります(無限のスクロールがあるため、非常に非効率的です)。

これをSeleniumで直接行うことが可能かどうか、そして可能であればどのように知っていますか?

16
AutomaticStatic

すべてのブロックを取得するには find_elements_by_class_name() を使用し、titleおよびcompanyを取得するには find_element_by_xpath() を使用します各人:

persons = []
for person in driver.find_elements_by_class_name('person'):
    title = person.find_element_by_xpath('.//div[@class="title"]/a').text
    company = person.find_element_by_xpath('.//div[@class="company"]/a').text

    persons.append({'title': title, 'company': company})
24
alecxe