如何用Selenium Python获取标签后的文本(如电话/传真号码)?
问题描述
给定无唯一标识包裹号码的HTML结构:
<p> <label>Phone Numbers:</label> <br> <label>Voice Number:</label> " (321) 456-7890" <br> <label>Fax Number:</label> " (123) 456-7890" </p>
规则说明:
- 若存在电话和/或传真号码,则必存在“Phone Numbers:”标签;
- 若号码不存在,对应标签也不会出现;
- 若号码存在,对应标签必存在,但号码内容会变化。
已通过以下代码定位到对应标签,但不知道如何获取标签后的号码文本:
driver.find_element(By.XPATH, '//label[text() = "Voice Number:"]') driver.find_element(By.XPATH, '//label[text() = "Fax Number:"]')
解决方案
下面提供几种可行的实现方式:
方法1:XPath直接定位同级文本节点
利用XPath的following-sibling语法,直接定位标签后的第一个文本节点,提取内容后清理多余字符:
# 获取Voice Number voice_label = driver.find_element(By.XPATH, '//label[text() = "Voice Number:"]') voice_number = voice_label.find_element(By.XPATH, './following-sibling::text()[1]').get_attribute('textContent').strip().strip('"') # 获取Fax Number fax_label = driver.find_element(By.XPATH, '//label[text() = "Fax Number:"]') fax_number = fax_label.find_element(By.XPATH, './following-sibling::text()[1]').get_attribute('textContent').strip().strip('"')
方法2:父容器文本分割提取
如果XPath文本节点定位有兼容性问题,可以先获取包含所有号码的<p>容器文本,再通过标签分割提取:
# 找到包含所有号码的父容器 phone_container = driver.find_element(By.XPATH, '//label[text() = "Phone Numbers:"]/parent::p') full_text = phone_container.text # 提取Voice Number if 'Voice Number:' in full_text: voice_number = full_text.split('Voice Number:')[1].split('\n')[0].strip().strip('"') # 提取Fax Number if 'Fax Number:' in full_text: fax_number = full_text.split('Fax Number:')[1].split('\n')[0].strip().strip('"')
方法3:执行JavaScript获取相邻文本
通过JS代码直接获取标签的下一个兄弟文本节点内容:
# 获取Voice Number voice_label = driver.find_element(By.XPATH, '//label[text() = "Voice Number:"]') voice_number = driver.execute_script('return arguments[0].nextSibling.textContent;', voice_label).strip().strip('"') # 获取Fax Number fax_label = driver.find_element(By.XPATH, '//label[text() = "Fax Number:"]') fax_number = driver.execute_script('return arguments[0].nextSibling.textContent;', fax_label).strip().strip('"')
内容的提问来源于stack exchange,提问作者rdone
相关产品推荐
相关产品推荐

