You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:07:14