首页 > 解决方案 > xpath 选择器返回空值

问题描述

我正在尝试使用 python、selenium 和 xpath 选择器来操作“critical-product-marquee-container”div 下所有跨度的文本。

<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 &amp; 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 &amp; 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>

我的代码如下:

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")]')))

它返回所有跨度元素的丢失,但是当尝试打印跨度文本时,它仅打印前两个跨度,其余为空。有什么建议吗?

标签: pythonseleniumxpath

解决方案


基本上这是 HTML5 中的字幕,所以你必须明确地等待每个元素。

代码 :

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)

输出 :

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

推荐阅读