Python 使用Selenium仅通过XPath的一部分查找元素
我正在尝试查找具有不断变化的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
//*[@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")))
要处理动态元素incluseWebDriverWait
()和位于()的元素的可见性,请使用以下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标记为目标。