如何使用BeautifulSoup从公共标签下提取子元素获取同义词?
解决方案
修正后的代码
from bs4 import BeautifulSoup import requests def fetch_synonyms(target_word): # 构造请求URL,处理带空格的单词 url = f"https://www.thesaurus.com/browse/{target_word.replace(' ', '%20')}" # 添加请求头避免反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 定位同义词专属区域(通过aria-labelledby属性过滤,比class/id更稳定) synonym_block = soup.find("section", {"aria-labelledby": lambda attr: attr and "synonyms" in attr.lower()}) if not synonym_block: return [] # 提取所有同义词文本,保留带空格的完整短语 synonym_list = [link.get_text(strip=True) for link in synonym_block.select('div[data-testid="word-grid-container"] a')] return synonym_list # 示例调用 print(fetch_synonyms("good"))
关键说明
- 稳定定位同义词区域:使用
aria-labelledby属性过滤出同义词section,这个属性的命名逻辑很少变动,比随单词变化的class/id更可靠,能直接排除反义词区域。 - 正确提取文本:直接遍历目标容器内的所有
<a>标签,用get_text(strip=True)提取每个链接的完整文本,自动处理带空格的同义词(比如“fine and dandy”会作为单个列表元素保留)。 - 反爬处理:添加
User-Agent请求头,避免被网站的反爬机制拦截。
原代码问题分析
- 原代码中
ele.findChildren('ul', recursive=False)返回的是<ul>元素的列表,直接调用.text会报错(列表没有该属性)。 - 没有深入到
<a>标签层级提取文本,导致无法获取单个同义词的完整内容。
内容的提问来源于stack exchange,提问作者tlars25
相关产品推荐
相关产品推荐

