我正在尝试从以下网页上收集每种产品的价格信息:https://www.safetysign.com/products/7337/ez-pipe-marker
我在Python 3和Windows 10中使用Selenium和FireFox。
这是我当前的代码:
driver = webdriver.Firefox()
driver.get('https://www.safetysign.com/products/7337/ez-pipe-marker')
#frame = driver.find_element_by_class_name('product-dual-holder')
# driver.switch_to.frame('skuer5c866ddb91611')
# driver.implicitly_wait(5)
driver.find_element_by_id('skuer5c866ddb91611-size-label-324').click()
price = driver.find_element_by_class_name("product-pricingnodecontent product-price-content").text.replace('$', '')
products.at[counter, 'safetysign.com Price'] = price
print(price)
print(products['safetysign.com URL'].count()-counter)
因此,我尝试通过按ID选择第一个产品变体开始(我也尝试过使用类名)。但是,我收到了无法定位元素的错误。正如在许多SO帖子中所建议的那样,我试图更改框架(即使我在包含该元素的html中找不到框架标签)。我尝试使用索引,类名和我认为可能是框架的不同div元素的ID切换到不同的框架,但是这些都不起作用。我也尝试使用等待,但是返回相同的错误。
知道我丢失或做错了什么吗?
答案 0 :(得分:1)
要找到要为titles = hash.values.map(&:keys).flatten.uniq
rows = hash.values.map { |data| data.values_at(*titles) }
s = CSV.generate do |csv|
csv << titles
rows.each do |row|
csv << row
end
end
生成 WebDriverWait 的元素,可以创建一个 List 并将其遍历到visibility_of_all_elements_located()
项目,您可以使用以下解决方案:
代码块:
click()
答案 1 :(得分:0)
它们很可能是动态的。改用label
类型选择器选择,然后索引以单击所需的项目,例如您提到的项目为0(列表中的第一项)。另外,添加一个等待条件以使label
出现。
如果只想限制5个size
选择,则使用以下CSS选择器代替label
:
.sku-contents ul:nth-child(3) label
即
sizes = WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".sku-contents ul:nth-child(3) label")))
sizes[0].click()
选择大小后,您可以从价格节点中获取价格,具体取决于您是否想要给定样本数量的价格,例如0-99。
要获取最终价格,请使用:
.product-under-sku-total-label
代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = 'https://www.safetysign.com/products/7337/ez-pipe-marker'
driver = webdriver.Chrome()
driver.get(url)
labels = WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "label")))
labels[0].click()
price0to99 = driver.find_element_by_css_selector('.product-pricingnodecontent').text
priceTotal = driver.find_element_by_css_selector('.product-under-sku-total-label').text
print(priceTotal, price0To99)
# driver.quit()