Как извлечь текст $ 7.56 с веб-страницы, используя Selenium через Python - PullRequest
1 голос
/ 21 января 2020
  1. Go в: https://www.goodrx.com/amoxicillin
  2. Щелкните правой кнопкой мыши по $ 7,56 (или любой цене) -> скопируйте xpath в chrome dev tools

Я пробовал все эти варианты:

find_element(By.XPATH, '// *[ @ id = "uat-price-row-coupon-1"] / div[3] / div[1] / text()')  
find_element(By.XPATH, "//*[@id='uat-price-row-coupon-0']/div[3]/div[1]/text()")  
find_element_by_xpath("//*[@id='uat-price-row-coupon-1']/div[3]/div[1]/text()")  

Я также подтвердил, что это работает в "Try Xpath" в Firefox

Но я получаю "нет такого элемента" из селена со всеми из них.

Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 21 января 2020

Чтобы извлечь текст $ 7,56 , поскольку это текстовый узел, вам нужно вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать любую из следующих стратегий локатора :

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

    driver.get('https://www.goodrx.com/amoxicillin')
    element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "ul[aria-label='List of best coupons by price and pharmacy.']>li div[data-qa='drug_price']")))
    print(driver.execute_script('return arguments[0].childNodes[1].textContent;', element).strip())
    
  • Использование XPATH:

    driver.get('https://www.goodrx.com/amoxicillin')
    element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//ul[@aria-label='List of best coupons by price and pharmacy.']/li//div[@data-qa='drug_price']")))
    print(driver.execute_script('return arguments[0].childNodes[1].textContent;', element).strip())
    
  • Вывод на консоль:

    $7.56
    
  • Примечание : необходимо добавить следующие операции импорта:

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

Используйте WebDriverWait для ожидания видимости элементов. На сайте есть защита ботов, будьте готовы к проверке.

import re
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ...

wait = WebDriverWait(driver, 20)
with driver:
    driver.get("https://www.goodrx.com/amoxicillin")

    rows = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'li[data-qa="price_row"]')))
    for row in rows:
        store_name = row.find_element_by_css_selector('[class^="goldAddUnderline"]').text.strip()
        drug_price = row.find_element_by_css_selector('[data-qa="drug_price"]').text.strip()
        drug_price = re.findall(r"\d+.\d+", drug_price)[0]
        print(store_name, drug_price)
...