使用 Selenium 单击 table 中的特定链接
Using Selenium to click specific links in a table
我必须从这个 link 收集数据:https://datacentersupport.lenovo.com/gb/en/products/storage/fibre-channel-switches/b6505-fc-san-switch/3873/parts/display/compatible
但是我很难访问替代品下的数据(注意:并非所有替代品都有替代品)。那些有替代品的看起来像这样:
示例位于 link
的第 2 页
请帮我完成代码,我必须收集替代品的零件号。
这是我的代码:
from selenium import webdriver
from time import sleep
import csv
# initializing webdriver
driver = webdriver.Chrome(executable_path="~~chromedriver.exe")
url = "https://datacentersupport.lenovo.com/gb/en/products/storage/fibre-channel-switches/b6505-fc-san-switch/3873/parts/display/compatible"
driver.get(url)
sleep(5)
#getting breadcrumbs
bread1 = driver.find_element_by_xpath("//span[@class='prod-catagory-name']")
bread2 = driver.find_element_by_xpath("//span[@class='prod-catagory-name']/a")
#grabbing table data and navigating
pages = int(driver.find_element_by_xpath("//div[@class='page-container']/span[@class='icon-s-right active']/preceding-sibling::span[1]").text)
num = pages -1
for _ in range(num):
rows = driver.find_elements_by_xpath("//table/tbody/tr/td[2]/div")
for row in rows:
parts = row.text
with open(filename, 'a', encoding='utf-8') as file:
file.write(url + "," + bread1.text + "," + bread2.text + "," + parts + "\n")
pagination = driver.find_element_by_xpath("//div[@class='pagecontainer']/span[@class='icon-s-right active']").click()
sleep(5)
driver.close()
如果我需要更改或修改代码以获得替代品,请告诉我。
要访问 webpage you need to expand the Substitutes inducing WebDriverWait for the visibility_of_all_elements_located()
and you can use either of the following 中替换项下的数据:
代码块:
driver.get("https://datacentersupport.lenovo.com/gb/en/products/storage/fibre-channel-switches/b6505-fc-san-switch/3873/parts/display/compatible")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.icon-select-down"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[contains(., '20')]"))).click()
for element in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "span[class='icon-s-down']"))):
element.click()
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[@class='icon-s-up']//following::tr[3]/td[contains(@class,'enabled-border')]//div[text()]"))).text)
控制台输出:
Lenovo 30m LC-LC OM3 MMF Cable
Lenovo 30m LC-LC OM3 MMF Cable
5m LC-LC OM3 MMF Cable
5m LC-LC OM3 MMF Cable
我必须从这个 link 收集数据:https://datacentersupport.lenovo.com/gb/en/products/storage/fibre-channel-switches/b6505-fc-san-switch/3873/parts/display/compatible
但是我很难访问替代品下的数据(注意:并非所有替代品都有替代品)。那些有替代品的看起来像这样:
示例位于 link
的第 2 页请帮我完成代码,我必须收集替代品的零件号。
这是我的代码:
from selenium import webdriver
from time import sleep
import csv
# initializing webdriver
driver = webdriver.Chrome(executable_path="~~chromedriver.exe")
url = "https://datacentersupport.lenovo.com/gb/en/products/storage/fibre-channel-switches/b6505-fc-san-switch/3873/parts/display/compatible"
driver.get(url)
sleep(5)
#getting breadcrumbs
bread1 = driver.find_element_by_xpath("//span[@class='prod-catagory-name']")
bread2 = driver.find_element_by_xpath("//span[@class='prod-catagory-name']/a")
#grabbing table data and navigating
pages = int(driver.find_element_by_xpath("//div[@class='page-container']/span[@class='icon-s-right active']/preceding-sibling::span[1]").text)
num = pages -1
for _ in range(num):
rows = driver.find_elements_by_xpath("//table/tbody/tr/td[2]/div")
for row in rows:
parts = row.text
with open(filename, 'a', encoding='utf-8') as file:
file.write(url + "," + bread1.text + "," + bread2.text + "," + parts + "\n")
pagination = driver.find_element_by_xpath("//div[@class='pagecontainer']/span[@class='icon-s-right active']").click()
sleep(5)
driver.close()
如果我需要更改或修改代码以获得替代品,请告诉我。
要访问 webpage you need to expand the Substitutes inducing WebDriverWait for the visibility_of_all_elements_located()
and you can use either of the following
代码块:
driver.get("https://datacentersupport.lenovo.com/gb/en/products/storage/fibre-channel-switches/b6505-fc-san-switch/3873/parts/display/compatible") WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.icon-select-down"))).click() WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[contains(., '20')]"))).click() for element in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "span[class='icon-s-down']"))): element.click() print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[@class='icon-s-up']//following::tr[3]/td[contains(@class,'enabled-border')]//div[text()]"))).text)
控制台输出:
Lenovo 30m LC-LC OM3 MMF Cable Lenovo 30m LC-LC OM3 MMF Cable 5m LC-LC OM3 MMF Cable 5m LC-LC OM3 MMF Cable