Reputation: 43
i'm trying to manipulate text from all spans under "critical-product-marquee-container" div using python, selenium and xpath selector.
<div data-v-936e71a8="" class="critical-product-marquee-container">
<div data-v-936e71a8="" class="marquee-text-wrap">
<div data-v-936e71a8="" class="marquee-text-content">
<div data-v-936e71a8="" class="marquee-text-text"
style="animation-duration: 40s;">
<span data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Surgical & Reusable
Masks:</span><span data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 1,215,028,138 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Surface Wipes:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 56,023,303 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Gowns and Coveralls:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 22,899,306 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Respirators:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 11,732,566 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Face Shields:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 4,731,581 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Hand Sanitizer:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 527,672 L </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Surface Solutions:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 48,337 L </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Ventilators:</span><span
data-v-936e71a8="" class="line-item-bold critical"
style="padding-right: 2em;"> 500 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Thermometers:</span><span
data-v-936e71a8="" class="line-item-bold critical"
style="padding-right: 2em;"> 6,922 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Testing Kits:</span><span
data-v-936e71a8="" class="line-item-bold critical"
style="padding-right: 2em;"> 22,205 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Disposable Gloves:</span><span
data-v-936e71a8="" class="line-item-bold critical"
style="padding-right: 2em;"> 137,455,881 units </span></span></span>
</div>
<div data-v-936e71a8="" class="marquee-text-text"
style="animation-duration: 40s;">
<span data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Surgical & Reusable
Masks:</span><span data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 1,215,028,138 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Surface Wipes:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 56,023,303 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Gowns and Coveralls:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 22,899,306 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Respirators:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 11,732,566 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Face Shields:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 4,731,581 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Hand Sanitizer:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 527,672 L </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Surface Solutions:</span><span
data-v-936e71a8="" class="line-item-bold available"
style="padding-right: 2em;"> 48,337 L </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Ventilators:</span><span
data-v-936e71a8="" class="line-item-bold critical"
style="padding-right: 2em;"> 500 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Thermometers:</span><span
data-v-936e71a8="" class="line-item-bold critical"
style="padding-right: 2em;"> 6,922 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Testing Kits:</span><span
data-v-936e71a8="" class="line-item-bold critical"
style="padding-right: 2em;"> 22,205 units </span></span></span><span
data-v-936e71a8=""><span data-v-936e71a8=""><span
data-v-936e71a8="" class="bold">Disposable Gloves:</span><span
data-v-936e71a8="" class="line-item-bold critical"
style="padding-right: 2em;"> 137,455,881 units </span></span></span>
</div>
</div>
</div>
</div>
my code is as follows:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
options = webdriver.ChromeOptions();
options.add_argument('headless');
driver = webdriver.Chrome(options=options)
url = 'https://www.rrpcanada.org/#/' # site I'm scraping
driver.get(url)
item_elements = WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.XPATH, '//div[@class="critical-product-marquee-container"]//span[@class="bold"]')))
quantity_elements = WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.XPATH, '//div[@class="critical-product-marquee-container"]//span[contains(@class, "line-item-bold")]')))
it returns a lost of all span elements but when trying to print the span text it prints the first two spans only, the rest are empty. any advice?
Upvotes: 1
Views: 292
Reputation: 29362
basically that's marquee in HTML5, so you have to explicitly wait for each elements.
Code :
driver = webdriver.Chrome(driver_path)
driver.maximize_window()
driver.implicitly_wait(50)
driver.get("https://www.rrpcanada.org/#/")
wait = WebDriverWait(driver, 50)
try:
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[class$='unset-margin']"))).click()
except:
pass
elements = driver.find_elements(By.XPATH, "//div[contains(@class, 'marquee-text-text')]//descendant::span[@class='bold']")
for ele in elements:
wait.until(EC.visibility_of(ele))
print(ele.text)
new_ele = ele.find_element_by_xpath(".//following-sibling::span")
wait.until(EC.visibility_of(new_ele))
print(new_ele.text)
Output :
"C:\Program Files\Python39\python.exe" C:/Users/****/PycharmProjects/SeleniumSO/Chrome.py
Surgical & Reusable Masks:
1,215,028,138 units
Surface Wipes:
56,023,303 units
Gowns and Coveralls:
22,899,306 units
Respirators:
11,732,566 units
Face Shields:
4,731,581 units
Hand Sanitizer:
527,672 L
Surface Solutions:
48,337 L
Ventilators:
500 units
Thermometers:
6,922 units
Testing Kits:
22,205 units
Disposable Gloves:
137,455,881 units
Surgical & Reusable Masks:
1,215,028,138 units
Surface Wipes:
56,023,303 units
Gowns and Coveralls:
22,899,306 units
Respirators:
Upvotes: 1