使用 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)
我正在尝试从 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)