python - 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 & 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>
我的代码如下:
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")]')))
它返回所有跨度元素的丢失,但是当尝试打印跨度文本时,它仅打印前两个跨度,其余为空。有什么建议吗?
解决方案
基本上这是 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:
推荐阅读
- jquery - jQuery - 变量正在跨实例共享
- oracle - Oracle如何在行选择中进行外连接
- google-cloud-sql - 如何将云功能连接到cloudsql
- angular - Angular:从指令访问 FormControl
- javascript - onesignal 通知限制到特定国家
- reactjs - React 中的 document.title(静态页面)
- c# - 垃圾收集禁用 Listview 源加载 Xamarin 表单
- c# - 如何创建 GUI 以将命令和参数发送到命令行应用程序?
- sql-server - 优化使用多个 CTE 的复杂视图
- wordpress - 使用 SMTP 的联系表 7 电子邮件