Je l'ai fait avec BeautifulSoup mais c'est un peu lourd, et j'essaie de savoir si je peux le faire directement avec Selenium.
Disons que j'ai le code HTML suivant, qui se répète plusieurs fois dans la source de la page avec des éléments identiques mais un contenu différent:
<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>
J'ai besoin de construire un dictionnaire où l'entrée pour chaque personne ressemble à:
dict = {'name' : 'John Smith', 'company' : 'SalesForce'}
Je peux facilement demander à Selenium de produire une liste du contenu de chaque élément de niveau supérieur en faisant:
driver.find_elements_by_class_name('person')
Mais je ne peux pas parcourir la liste car la méthode ci-dessus ne restreint pas la portée/source au contenu de cet élément.
Si j'essaie de faire quelque chose comme ça:
people = driver.find_elements_by_class_name('person')
for person in people:
print person.find_element_by_xpath['//div[@class="title"]//a').text
Je reçois juste le même nom encore et encore.
Je dois faire ce groupe par groupe car dans mon cas, itérer sur toute la page et ajouter chaque balise individuellement ne fonctionnera pas (il y a un défilement infini, donc ce serait vraiment inefficace).
Est-ce que quelqu'un sait s'il est possible de le faire directement dans Selenium, et si oui, comment?
Utilisez find_elements_by_class_name()
pour obtenir tous les blocs et find_element_by_xpath()
pour obtenir title
et company
pour chaque personne:
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})