如何用Selenium与XPATH提取加粗链接后的文本?
问题描述
我能成功提取网页中加粗政客的姓名及个人主页URL,但无法获取姓名之后的文本。尝试过.//b/following-sibling::text()等多种XPATH表达式都无效。
网页示例片段:
Corey Stapleton (R), former Montana Secretary of State, announced his candidacy on November 11, 2022.[35] Stapleton withdrew from the race on October 13, 2023
需要提取Corey Stapleton之后的所有文本。
以下是我的代码:
driver = webdriver.Chrome() pres_candidates_url = "https://ballotpedia.org/Presidential_candidates,_2024" driver.get(pres_candidates_url) elems = driver.find_elements(By.XPATH, "//div[@class='mw-parser-output']//ul//li") all_members = [] for elem in elems: member = {} try: linktext = elem.find_element(By.XPATH,".//b//a") except: continue words = linktext.text.split() print # words = elem.text.split() count = 0 for w in words: #linktext contains non-names so remove those based on more than one word being lowercase if w[0].islower(): count +=1 if count < 1: name = linktext.text member_url = linktext.get_attribute("href") try: desctext = elem.find_element(By.XPATH,".//b/following-sibling::text()") except: print("error") if "(D)" in desctext: party = "Democrat" elif "(R)" in desctext: party = "Republican" else: party = desctext metadata = {"Party:": party} print(name, member_url, metadata) member["name"], member["url"], member["metadata"] = name, member_url, metadata else: continue all_members.append(member)
问题原因与解决方法
问题出在Selenium的find_element只能定位元素节点,无法直接获取文本节点。要提取<b>标签后的文本,有两种可行方案:
方案1:提取整个列表项文本,截断姓名部分
直接获取<li>的完整文本,去掉开头的姓名内容:
# 替换原代码中获取desctext的逻辑 full_text = elem.text # 只替换一次姓名,避免重复内容干扰 desc_text = full_text.replace(name, "", 1).strip()
方案2:用XPATH获取后续节点的文本内容
通过XPATH定位<b>标签后的所有节点,再提取文本内容:
# 替换原代码中获取desctext的逻辑 desc_text = elem.find_element(By.XPATH, ".//b/following-sibling::node()").get_attribute('textContent').strip()
修改后的完整代码
driver = webdriver.Chrome() pres_candidates_url = "https://ballotpedia.org/Presidential_candidates,_2024" driver.get(pres_candidates_url) elems = driver.find_elements(By.XPATH, "//div[@class='mw-parser-output']//ul//li") all_members = [] for elem in elems: member = {} try: linktext = elem.find_element(By.XPATH,".//b//a") except: continue words = linktext.text.split() count = 0 for w in words: if w[0].islower(): count +=1 if count < 1: name = linktext.text member_url = linktext.get_attribute("href") # 方案1:截断完整文本获取后续内容 full_text = elem.text desc_text = full_text.replace(name, "", 1).strip() # 提取党派信息 party = "" if "(D)" in desc_text: party = "Democrat" elif "(R)" in desc_text: party = "Republican" else: party = desc_text.split(',')[0].strip() if ',' in desc_text else desc_text metadata = {"Party": party, "Description": desc_text} print(name, member_url, metadata) member["name"], member["url"], member["metadata"] = name, member_url, metadata else: continue all_members.append(member)
内容的提问来源于stack exchange,提问作者Noey
相关产品推荐
相关产品推荐

