[英]How to iterate through web table with Selenium?
我一直在嘗試遍歷 Crunchbase 上的這個 EV 公司表,但由於某種原因,代碼只是拉出第一行。 知道為什么嗎? 謝謝 ! :)
#imports
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import time
#paths
PATH = "C:/Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://www.crunchbase.com/search/organizations/field/organization.companies/categories/electric-vehicle")
driver.maximize_window()
time.sleep(5)
print(driver.title)
WebDriverWait(driver, 20).until(
EC.visibility_of_element_located(
(By.XPATH, ('/html/body/chrome/div/mat-sidenav-container/mat-sidenav-content/div/search/page-layout/div/div/form/div[2]/results/div/div/div[3]/sheet-grid/div/div/grid-body/div/grid-row[1]/grid-cell[2]/div/field-formatter/identifier-formatter/a/div/div')
)))
companies = driver.find_elements_by_css_selector("div.identifier-label")
#create company dictionary and iterate through Crunchbase EV company table
company_list = []
for company in companies:
name = company.find_element_by_xpath('/html/body/chrome/div/mat-sidenav-container/mat-sidenav-content/div/search/page-layout/div/div/form/div[2]/results/div/div/div[3]/sheet-grid/div/div/grid-body/div/grid-row[1]/grid-cell[2]/div/field-formatter/identifier-formatter/a/div/div').text
industry = company.find_element_by_xpath('/html/body/chrome/div/mat-sidenav-container/mat-sidenav-content/div/search/page-layout/div/div/form/div[2]/results/div/div/div[3]/sheet-grid/div/div/grid-body/div/grid-row[1]/grid-cell[3]/div/field-formatter/identifier-multi-formatter/span').text
hq = company.find_element_by_xpath('/html/body/chrome/div/mat-sidenav-container/mat-sidenav-content/div/search/page-layout/div/div/form/div[2]/results/div/div/div[3]/sheet-grid/div/div/grid-body/div/grid-row[1]/grid-cell[4]/div/field-formatter/identifier-multi-formatter/span').text
cblist = {
'name': name,
'industry': industry,
'hq': hq
}
company_list.append(cblist)
#create dataframe
df = pd.DataFrame(company_list)
print(df)
為所有標識符中的 for 循環內的每次迭代增加網格行索引,例如..
row_index = row_index + 1
name = company.find_element_by_xpath(
'/html/body/chrome/div/mat-sidenav-container/mat-sidenav-content/div/search/page-layout/div/div/form/div[2]/results/div/div/div[3]/sheet-grid/div/div/grid-body/div/grid-row['+str(row_index)+']/grid-cell[2]/div/field-formatter/identifier-formatter/a/div/div').text
首先,您應該獲取所有grid-row
以獲取表中的所有行,然后您應該使用相對 xpath(以.
開頭)僅在選定的行中進行搜索。
all_rows = driver.find_elements_by_css_selector("grid-row")
all_companies = []
for row in all_rows:
company = {
'name': row.find_element_by_xpath('.//*[@class="identifier-label"]').text.strip(),
'industry': row.find_element_by_xpath('.//*[@data-columnid="categories"]//span').text.strip(),
'hq': row.find_element_by_xpath('.//*[@data-columnid="location_identifiers"]//span').text.strip(),
'cb rank': row.find_element_by_xpath('.//*[@data-columnid="rank_org"]').text.strip(),
}
all_companies.append(company)
您還應該學習使用class
、 id
和任何其他唯一值 - 即。 data-columnid
。
完整的工作代碼
#imports
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import time
#paths
PATH = "C:/Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)
#driver = webdriver.Chrome()
url = "https://www.crunchbase.com/search/organizations/field/organization.companies/categories/electric-vehicle"
driver.get(url)
driver.maximize_window()
time.sleep(5)
print('title:', driver.title)
WebDriverWait(driver, 20).until(
EC.visibility_of_element_located(
(By.XPATH, ('//grid-body//identifier-formatter/a/div/div')
)))
all_rows = driver.find_elements_by_css_selector("grid-row")
all_companies = []
for row in all_rows:
company = {
'name': row.find_element_by_xpath('.//*[@class="identifier-label"]').text.strip(),
'industry': row.find_element_by_xpath('.//*[@data-columnid="categories"]//span').text.strip(),
'hq': row.find_element_by_xpath('.//*[@data-columnid="location_identifiers"]//span').text.strip(),
'cb rank': row.find_element_by_xpath('.//*[@data-columnid="rank_org"]').text.strip(),
}
all_companies.append(company)
#create dataframe
df = pd.DataFrame(all_companies)
print(df)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.