使用不带 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

在这里抓取数据会更容易,而不是转到每个维基百科站点。