如何在B标签中找到文本后定位下一个元素- Selenium Python

6gpjuf90  于 2023-01-26  发布在  Python
关注(0)|答案(3)|浏览(154)

我正在尝试提取包含特定文本的b标签后面的文本值。我正在使用Selenium Web驱动程序和Python3。
下面是为我试图返回的值(11,847)检查的HTML:

下面有一个Xpath(我没有直接使用这个xpath来查找元素,因为我计划迭代的不同示例的表结构会发生变化):
/html/body/form[1]/div[2]/table[2]/tbody/tr[3]/td[2]/text()
例如,当我打印下面的代码时,它返回Att:即,通过我在b标记内搜索文本"Att"而定位的元素。
att=driver.find_element("xpath",".//b[contains(text(), 'Att')]").text
print(att)
有没有一种方法可以通过搜索'Att:'返回<b>Att:</b>后面的值(或者反过来,我也想返回<b>Ref:</b>后面的值)?
先谢了。

liwlm1x9

liwlm1x91#

11,847文本内容属于td节点。
可以通过b子元素b文本内容来定位td元素。
然后,您将能够检索该td节点的整个文本内容。
它将包含Att:和额外的空格以及所需的11,847字符串。
现在,您需要删除Att:和多余的空格,这样只会保留11,847
具体如下:

#get the entire text content
entire_text = driver.find_element(By.XPATH,"//td[.//b[contains(text(), 'Att')]]").text
#get the child node text content
child_text = driver.find_element(By.XPATH,"//b[contains(text(), 'Att')]").text
#remove child text content from entire text content
goal_text = entire_text.replace(child_text,'')
#trim white spaces
goal_text = goal_text.strip()
5t7ly7z5

5t7ly7z52#

可以使用find_element_by_xpath()方法定位包含文本'Att:'的元素,然后再次使用find_element_by_xpath()方法定位以下文本节点。下面是如何执行此操作的示例:

att_element = driver.find_element_by_xpath("//b[contains(text(), 'Att:')]")
att_value = att_element.find_element_by_xpath('./following-sibling::text()').text
print(att_value)

这将定位包含文本'Att:'的元素,然后定位下面的文本节点,并返回该节点的文本值。
同样,您可以为“Ref:”使用相同的xpath,也可以将文本部分更改为“Ref:”

ref_element = driver.find_element_by_xpath("//b[contains(text(), 'Ref:')]")
ref_value = ref_element.find_element_by_xpath('./following-sibling::text()').text
print(ref_value)

请注意,只有当您尝试提取的文本值紧跟在文本节点中包含“Att:”或“Ref:”的元素之后时,此操作才有效。

vs91vp4v

vs91vp4v3#

以下 xpath 将导致错误:

/html/body/form[1]/div[2]/table[2]/tbody/tr[3]/td[2]/text()

因为Selenium只返回WebElement而不返回对象。
溶液
文本 11,847 位于作为<td>节点的第二个子节点的文本节点中。因此,要打印文本,必须引发WebDriverWait等待visibility_of_element_located(),并且可以使用以下locator strategies之一:

  • 使用 XPATH 和 * 子节点[n]*:
print(driver.execute_script('return arguments[0].childNodes[2].textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//tr[@class='initial']//td[@align='right']")))).strip())
  • 使用 XPATHsplitlines()
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//tr[@class='initial']//td[@align='right']"))).get_attribute("innerHTML").splitlines()[2])

*注意:您必须添加以下导入:

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

相关问题