使用不带 XPath 的 Selenium 查找元素
Find the element using Selenium without XPath
我想从维基百科上抓取有关 2019 年美国机场年度乘客的数据。可以通过此处的机场页面访问此数字(所需数字以粉红色突出显示):
我写了这段适用于这个特定元素的 Xpath 的代码:
from selenium import webdriver
import selenium
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
def search(link):
driver = webdriver.Safari()
driver.get("https://en.wikipedia.org/")
elem = driver.find_element_by_name("search")
elem.clear()
elem.send_keys(link)
elem.submit()
time.sleep(3)
elem1 = driver.find_element_by_xpath('//*[@id="mw-content-text"]/div/table[1]/tbody/tr[20]/td/table/tbody/tr[2]/td/text()')
num = elem1.text
print(num)
driver.close()
search('IND airport')
而且效果很好!但仅适用于这个机场 :( 所以我需要从这个 table 访问这个值,但也适用于其他机场。有 Xpath 的替代方法吗?例如,如果我需要 JFK 的数据,我需要另一个 Xpath 使得我的代码无法用于机场列表。
使用下面的xpath
option.It 会识别Th tag with text contains Passengers
然后following-sibling::td
elem1 = driver.find_element_by_xpath("//*[@id='mw-content-text']//table/tbody//th[contains(.,'Passengers')]/following-sibling::td")
num = elem1.text
您需要尽可能概括这一点,因为不同的页面会有不同的行顺序等。
一种方法是获取所有 table 个单元格(tds,ths)并检查一个单元格是否包含乘客,如果您能够将以下单元格的值转换为整数(我假设所有乘客数都是整数)。
tcells = driver.find_elements_by_css_selector('.infobox th, .infobox td')
for i in range(len(tcells)):
if 'Passengers' in tcells[i].text:
try:
x = int( tcells[i+1].text.split(' ')[0].split('[')[0].replace(',', '') )
print(x)
break
except:
continue
您可以从这个维基百科网站获取乘客数据:
https://en.wikipedia.org/wiki/List_of_busiest_airports_by_passenger_traffic
在这里抓取数据会更容易,而不是转到每个维基百科站点。
我想从维基百科上抓取有关 2019 年美国机场年度乘客的数据。可以通过此处的机场页面访问此数字(所需数字以粉红色突出显示):
from selenium import webdriver
import selenium
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
def search(link):
driver = webdriver.Safari()
driver.get("https://en.wikipedia.org/")
elem = driver.find_element_by_name("search")
elem.clear()
elem.send_keys(link)
elem.submit()
time.sleep(3)
elem1 = driver.find_element_by_xpath('//*[@id="mw-content-text"]/div/table[1]/tbody/tr[20]/td/table/tbody/tr[2]/td/text()')
num = elem1.text
print(num)
driver.close()
search('IND airport')
而且效果很好!但仅适用于这个机场 :( 所以我需要从这个 table 访问这个值,但也适用于其他机场。有 Xpath 的替代方法吗?例如,如果我需要 JFK 的数据,我需要另一个 Xpath 使得我的代码无法用于机场列表。
使用下面的xpath
option.It 会识别Th tag with text contains Passengers
然后following-sibling::td
elem1 = driver.find_element_by_xpath("//*[@id='mw-content-text']//table/tbody//th[contains(.,'Passengers')]/following-sibling::td")
num = elem1.text
您需要尽可能概括这一点,因为不同的页面会有不同的行顺序等。
一种方法是获取所有 table 个单元格(tds,ths)并检查一个单元格是否包含乘客,如果您能够将以下单元格的值转换为整数(我假设所有乘客数都是整数)。
tcells = driver.find_elements_by_css_selector('.infobox th, .infobox td')
for i in range(len(tcells)):
if 'Passengers' in tcells[i].text:
try:
x = int( tcells[i+1].text.split(' ')[0].split('[')[0].replace(',', '') )
print(x)
break
except:
continue
您可以从这个维基百科网站获取乘客数据: https://en.wikipedia.org/wiki/List_of_busiest_airports_by_passenger_traffic
在这里抓取数据会更容易,而不是转到每个维基百科站点。