使用 Xpath 获取第二个实例的第一个兄弟

Getting first sibling of second instance using Xpath

我正在尝试从 this page:

中提取信息

我正在尝试提取时间(下午 6:30)。

我的策略是找到日期的第二个实例(2022 年 3 月 31 日),然后获取它的第一个兄弟。照片在这里(我想要黄色框内的部分):

这是我尝试过的方法:

#Get First Date (Date at top of the page)
    try:
        first_date = driver.find_elements_by_css_selector('a[href^="https://www.bandsintown.com/a/"] + div + div')
        first_date = first_date[0].text
    except (ElementNotVisibleException, NoSuchElementException, TimeoutException):
        print ("first_date doesn't exist")
        continue


 #Get time.  This will the first sibling of the second instance of date
    try:
        event_time = driver.find_elements_by_xpath("//div[text()='" + first_date + "'][1]/following-sibling::div")
        print(event_time[0].text)
    except (ElementNotVisibleException, NoSuchElementException, TimeoutException):
        continue

然而,这并没有让我得到我想要的。我在这里做错了什么?我正在寻找一种使用 Xpath 获取第二个实例的第一个同级的方法。

它似乎是 PM / AM 的第一个元素,所以我会使用 find_element

'//div[contains(text(), " PM") or contains(text(), " AM")]'

像这样

item = driver.find_element(By.XPATH, '//div[contains(text(), " PM") or contains(text(), " AM")]')
print(item.text)

我在 PM/AM 之前使用 space 以确保它不在 word 中。


当我添加 ( ) 时你的 xpath 工作,所以它首先获得 div,然后通过索引获得 select。
如果没有 (),它可能会将 [text()="..."][1] 视为 [text()="..." and 1]
它需要 [2] 而不是 [1] 因为 xpath 从 1 开始计数,而不是 0

"(//div[text()='" + first_date + "'])[2]/following-sibling::div"

完整的工作示例

from selenium import webdriver
from selenium.webdriver.common.by import By
#from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.firefox import GeckoDriverManager
import time

url = 'https://www.bandsintown.com/e/103275458-nayo-jones-at-promise-of-justice-initiative?came_from=253&utm_medium=web&utm_source=city_page&utm_campaign=event'

#driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())

driver.get(url)

time.sleep(5)

item = driver.find_element(By.XPATH, '//div[contains(text(), " PM") or contains(text(), " AM")]')
print(item.text)
print('---')

first_date = driver.find_elements(By.CSS_SELECTOR, 'a[href^="https://www.bandsintown.com/a/"] + div + div')
first_date = first_date[0].text
        
event_time = driver.find_elements(By.XPATH, "(//div[text()='" + first_date + "'])[2]/following-sibling::div")
print(event_time[0].text)

以下 xpath 将为您提供日期和时间。

日期:

print(driver.find_element_by_xpath("//a[text()='Promise of Justice Initiative']/following::div[4]").text)

时间:

print(driver.find_element_by_xpath("//a[text()='Promise of Justice Initiative']/following::div[5]").text)

或您的用途。

print(driver.find_element_by_xpath("
//a[contains(@href,'https://www.bandsintown.com/v/')]/following::div[contains(text(), 'PM') or contains(text(), 'AM')]").text)