2014-11-19 21 views
7

Bunu BeautifulSoup ile yaptım, ama biraz hantal ve Selenium ile doğrudan yapıp yapamayacağımı anlamaya çalışıyorum.Selenyum: Elementlerin grupları arasında yineleme

ı özdeş elemanlar ancak farklı içeriklerle sayfa kaynağında birden fazla defa aşağıdaki HTML, var diyelim: Ben her kişi için giriş benziyor nerede bir sözlük oluşturmak gerekir

<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'} 

kolayca yaparak her üst düzey eleman içeriğinin bir listesini üretmek için selenyum alabilirsiniz:

driver.find_elements_by_class_name('person') 

Ancak, bu durumda yukarıdaki yöntem, kapsamı/kaynağı yalnızca bu öğenin içeriğine göre daraltmadığından listeden yineleyemiyorum.

Böyle bir şey yapmaya çalışırsanız:

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

Ben sadece tekrar tekrar aynı adı olsun.

Bu grubu grupla yapmam gerekiyor çünkü benim durumumda, tüm sayfa boyunca yinelemek ve her bir etiketi tek tek eklemek işe yaramaz (sonsuz kaydırma var, bu yüzden gerçekten verimsiz olur).

Bunu doğrudan Selenyum'da yapmanın mümkün olup olmadığını bilen var mı, eğer öyleyse nasıl?

cevap

14

tüm blokları almak için kullanın find_elements_by_class_name() ve find_element_by_xpath() her bir kişi için title ve company almak için:

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}) 
+0

Bu gayet mantıklı ve henüz çalışmıyor. Lütfen, gönderdiğim ile aynı olduğuna inandığım OP'mdeki güncellenmiş örnek koduna bakın. Aynı ismi (listedeki ilk nesneden tahmin ediyorum) tekrar tekrar gönderir. Kapsamı daraltmıyor gibi görünmüyor ... – AutomaticStatic

+0

@AutomaticStatic Yanıtı gönderdikten kısa bir süre sonra güncelledim. Bir hata oluştu (döngüde '' '' yerine '' sürücü' kullanılırdı. Lütfen tekrar kontrol edin. Teşekkürler. – alecxe

+0

Tam olarak yazdıklarınızı yapıyorum (ne döndüğünü kontrol etmek için bir baskı bildirimi hariç) ve yine aynı adı tekrar tekrar döndürüyor. – AutomaticStatic