2014-11-19 15 views
7

Zrobiłem to z BeautifulSoup, ale jest to trochę kłopotliwe i próbuję ustalić, czy mogę to zrobić bezpośrednio z Selenium.Selen: Iterowanie po grupach elementów

Powiedzmy mam następujący kod HTML, który powtarza się wielokrotnie w źródle strony z identycznych elementów, ale różnej zawartości:

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

muszę zbudować słownik, w którym pozycja dla każdej osoby wygląda następująco:

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

mogę łatwo dostać Selen produkować listę zawartości każdego elementu najwyższego poziomu wykonując:

driver.find_elements_by_class_name('person') 

Ale nie mogę wykonać iteracji na liście, ponieważ powyższa metoda nie zawęża zakresu/źródła tylko do zawartości tego elementu.

Jeśli staram się zrobić coś takiego:

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

Właśnie dostać taką samą nazwę w kółko.

Potrzebuję wykonać tę grupę według grupy, ponieważ w moim przypadku powtarzanie całej strony i dołączanie każdego tagu indywidualnie nie będzie działać (jest nieskończone przewijanie, więc byłoby to naprawdę nieefektywne).

Czy ktoś wie, czy można to zrobić bezpośrednio w Selenie, a jeśli tak, to w jaki sposób?

Odpowiedz

14

Zastosowanie find_elements_by_class_name() aby wszystkie bloki i find_element_by_xpath() dostać title i company dla każdej osoby:

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

To ma sens, a mimo to nie działa. Zobacz zaktualizowany przykładowy kod w moim PO, który, jak sądzę, jest taki sam, jak opublikowany. Powtarza tę samą nazwę (domyślam się z pierwszego obiektu na liście) w kółko. Nie wydaje się, aby zawężał zakres ... – AutomaticStatic

+0

@AutomaticStatic Zaktualizowałem odpowiedź w skrócie po jej opublikowaniu. Wystąpił błąd (użyłem 'driver' zamiast' person' w pętli). Prosze Sprawdź ponownie. Dzięki. – alecxe

+0

Robię dokładnie to, co napisałeś (z wyjątkiem instrukcji print, aby sprawdzić, co powraca) i wciąż wraca to samo imię w kółko. – AutomaticStatic