Python 使用Selenium仅通过XPath的一部分查找元素

Python 使用Selenium仅通过XPath的一部分查找元素,python,selenium,xpath,web-scraping,Python,Selenium,Xpath,Web Scraping,我正在尝试查找具有不断变化的XPath的元素,其中只有一个部分保持不变: //*[@id="foo"]div[2]/div[1]/time //*[@id="bar"]div/div[2]/div[1]/time //*[@id="bat"]div[1]div[2]/div[1]/time 我已经尝试使用驱动程序。通过xpath(“//*[contains(text(),”/div[2]/div[1]/time')]”)查找\u元素,但这似乎不起作用 以下是一些HTML示例: <div

我正在尝试查找具有不断变化的XPath的元素,其中只有一个部分保持不变:

//*[@id="foo"]div[2]/div[1]/time
//*[@id="bar"]div/div[2]/div[1]/time
//*[@id="bat"]div[1]div[2]/div[1]/time
我已经尝试使用
驱动程序。通过xpath(“//*[contains(text(),”/div[2]/div[1]/time')]”)查找\u元素,但这似乎不起作用

以下是一些HTML示例:

<div class="entry-container">
<div class="entry-head">
<h3> some text </h3>
<time class="timestamp" datetime="2020-01-23 08:04:32 UTC">
Today at 18:34
</time>
</div>
</div>

一些文本
今天18:34

我想从
time
元素中获取文本。

以下XPath表达式:

//div/div//time

将为您提供所有
time
元素,其中包含两个
div
元素作为祖先。这适用于您提供的示例路径。

尝试此x路径定位器:

.//div[@class]/time

使用
Xpath
CSS
和webdriver wait尝试下面的代码,以便元素将加载到
DOM

导入:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
Xpath-1

element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "(//time[@class='timestamp'])[1]")))

Xpath-2

element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "(//time)[1]")))
由CSS提供

element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.CSS_SELECTOR , "time.timestamp")))

要处理动态元素incluse
WebDriverWait
()和位于
()的元素的可见性,请使用以下xpath选项

XPath1

print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//h3[contains(.,'some text')]/following-sibling::time[1]"))).text)
print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//h3[contains(.,'some text')]/following::time[1]"))).text)
print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//div[@class='entry-head']//h3[contains(.,'some text')]/following-sibling::time[1]"))).text)
XPath2

print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//h3[contains(.,'some text')]/following-sibling::time[1]"))).text)
print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//h3[contains(.,'some text')]/following::time[1]"))).text)
print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//div[@class='entry-head']//h3[contains(.,'some text')]/following-sibling::time[1]"))).text)
XPath3

print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//h3[contains(.,'some text')]/following-sibling::time[1]"))).text)
print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//h3[contains(.,'some text')]/following::time[1]"))).text)
print(WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//div[@class='entry-head']//h3[contains(.,'some text')]/following-sibling::time[1]"))).text)
您需要添加以下库

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

你能添加html吗?您可以在这里找到有关xpath的更多信息:请尝试使用
[contains(text(),'time')]
。contains(text())不适用于xpath。这将只找到文本为“time”的元素。如果您可以为相关元素提供HTML,这将更容易提供帮助。我在问题中添加了一些HTML。您尝试过我的解决方案吗?这对我不起作用,因为我要查找的元素不是
timestamp
类的第一个元素(位置不同).哪个部分是稳定的还是静态的?唯一真正稳定的部分是
时间
元素(事实上,它周围至少有两个
div
s.@Ramona我主要使用'time'标记,但我与class结合使用。你想要完整的时间元素列表吗?还是特定的列表还是单个时间元素?我一开始也试过了……我只是在寻找一个元素和唯一的“标识符”我能找到的是XPath。这里的问题是我不知道
h3
中的文本,但无论如何还是要感谢!应该有一些参考来找到元素的唯一方式,我相信你应该以h3标记为目标。