Селен печатает ту же информацию неоднократно - PullRequest
1 голос
/ 15 января 2020

Здравствуйте. Я пытаюсь очистить некоторые данные с веб-сайта, который имеет данные в теге 'dl'. Вот как выглядит структура веб-сайта

<div class="ecord-overview col-md-5">
<h2><span itemprop="name">Donald Duck</span></h2>
dl class="row">
</dd>
<dt class="col-md-4">Email</dt>
<dd class="col-md-8">myemail.com</dd>
</dl>
<div class="ecord-overview col-md-5">
<h2><span itemprop="name">Mickey mouse</span></h2>
dl class="row">
</dd>
<dt class="col-md-4">Email</dt>
<dd class="col-md-8">youremail.com</dd>
</dl>
... data goes on but value differs 

Для очистки я использую селен:

мой код для очистки

for element in driver.find_elements_by_class_name('ThatsThem-record-overview'): # here im scraping name
   #print(Style.RESET_ALL)
   print(Fore.RED + element.text + Style.RESET_ALL)
   #print(Style.RESET_ALL)
   time.sleep(1)
   dl= driver.find_element_by_tag_name('dl') # scraping data under dl tag 
   print(dl.text)
   print('-----------------------')# seperator

Так что же происходит, что всякий раз, когда я выполняю программу, она печатает dl одинаково для каждого имени и данных, как это

donald duck
Email
myemail.com
-------------
mickey mouse
Email
myemail.com

У меня есть я уже пытался ввести dl для l oop так же, как я делаю для печати имени, но он печатает и другие вещи, которые мне не нужны

что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Кажется, вы были близки. Использование класса record-overview должно было принести вам все необходимые данные. Однако было бы лучше настроить таргетинг на отдельные имя и email путем перехода к дочерним тегам. Кроме того, использование WebDriverWait оптимизирует производительность вашей программы.

Итак, в идеале вам нужно вызвать WebDriverWait для visibility_of_all_elements_located(), и вы можете использовать любой из следующих Стратегии локатора :

  • Использование CSS_SELECTOR:

    names[] = [my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.record-overview>h2>span")))]
    emails[] = [my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.record-overview dl.row dd")))]
    for name, email in zip(names, emails):
        print("{} Email is {}".format(name, email))
    
  • Использование XPATH:

    names[] = [my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[contains(@class, 'record-overview')]/h2/span")))]
    emails[] = [my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[contains(@class, 'record-overview')]//dl[@class='row']//dd")))]
    for name, email in zip(names, emails):
        print("{} Email is {}".format(name, email))
    
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 15 января 2020

driver.find_element_by_tag_name('dl') всегда будет возвращать первый соответствующий элемент. Вам нужно использовать element, чтобы найти <dl> s

for element in driver.find_elements_by_class_name('ThatsThem-record-overview'):
    dl = element.find_element_by_tag_name('dl') # scraping data under dl tag 
    print(dl.text)

Или просто найти эти элементы напрямую

for element in driver.find_elements_by_css_selector('.ThatsThem-record-overview dl'):
    print(element.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...