使用BeautifulSoup的Python函数含if-else却无返回值问题排查
问题分析与解决方案
核心问题
你提到执行时print能得到结果,但函数返回值“为空”,本质是调用函数时没有接收或打印返回值——你的函数最后确实有return a,但直接写transp_url('https://www.vivaqua.be/fr/')不会自动输出返回值,需要用print(transp_url('...'))或者赋值给变量查看。
另外你的代码还有几个可优化的地方:
- 没必要用
global a,局部变量即可完成逻辑 - 大小写匹配可以通过正则的
IGNORECASE参数简化,不用重复写两次不同大小写的匹配 - 找到的
href可能是相对路径,建议转成绝对URL,避免后续使用出错
优化后的代码
from bs4 import BeautifulSoup from urllib.request import Request, urlopen from urllib.parse import urljoin import re import ssl def transp_url(url): # 请求头,避免403错误 hdr = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding': 'none', 'Accept-Language': 'en-US,en;q=0.8', 'Connection': 'keep-alive' } # 忽略SSL证书错误 ssl._create_default_https_context = ssl._create_unverified_context req = Request(url, headers=hdr) html_page = urlopen(req) soup = BeautifulSoup(html_page, "lxml") # 1. 查找href包含transpar的链接(兼容大小写) link = soup.select_one("a[href*=transpar], a[href*=Transpar]") if link: # 转成绝对URL return urljoin(url, link['href']) # 2. 查找锚点文本包含transpar的链接(忽略大小写) link_text = soup.find("a", string=re.compile("transpar", flags=re.IGNORECASE)) if link_text: return urljoin(url, link_text['href']) # 3. 都没找到返回指定提示 return "No Transparency page" # 调用并打印返回值 result = transp_url('https://www.vivaqua.be/fr/') print(result)
关键优化点说明
- 移除全局变量:用局部变量存储结果,避免全局变量带来的意外问题
- 简化大小写匹配:
- CSS选择器通过
a[href*=transpar], a[href*=Transpar]覆盖大小写场景 - 文本匹配用
re.compile("transpar", flags=re.IGNORECASE)直接忽略大小写,无需重复编写正则
- CSS选择器通过
- 相对路径转绝对路径:用
urljoin(url, link['href'])把页面内的相对链接转换为完整URL,后续使用更便捷 - 明确接收返回值:调用函数后用变量接收并打印,即可看到实际返回结果
内容的提问来源于stack exchange,提问作者Le_vai
相关产品推荐
相关产品推荐

