Python内部函数失效求助:网页抓取IATA查询函数整合后无返回
机场IATA代码抓取函数整合后无返回问题排查
问题说明
开发机场IATA代码抓取项目时,拆分的iata_sing(单机场查询)和iata_multi(多机场查询)函数单独运行可正常返回结果,但将二者整合为单个iata函数的内部函数后,调用iata()无任何输出。
可正常运行的拆分代码
import requests import os import json from bs4 import BeautifulSoup browser_headers = { "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 OPR/67.0.3575.137"} def iata_sing(city): starting_letter = city[0].upper() iata_single = f"https://en.wikipedia.org/wiki/List_of_airports_by_IATA_airport_code:_{starting_letter}" sin_city = requests.get(url=iata_single, headers=browser_headers) sin_city.raise_for_status() sin_soup = BeautifulSoup(sin_city.content, 'html.parser') main = sin_soup.find('div', id='content').find_all('td') for line in main: if "title=" and city.title() in line.text: iata = line.findPreviousSibling().findPreviousSibling() iata_target = list(iata)[0] # print(iata_target) return iata_target def iata_multi(city): iata_multiple = "https://en.wikipedia.org/wiki/IATA_airport_code#Cities_with_multiple_airports" airport_list = [] city = city.title() cities = requests.get(url=iata_multiple, headers=browser_headers) cities.raise_for_status() soup = BeautifulSoup(cities.content, 'html.parser') # print(soup.prettify()) s = soup.find('div', id='content') body = s.find('div', class_='mw-parser-output') ULs = body.find_all('li') for line in ULs: if city in line.text: for item in line.text: airport_list.append(item) new_list = "".join(airport_list) return new_list # print(iata_multi("paris")) print(iata_sing("leigh"))
整合后失效的代码
def iata(city): browser_headers = { "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 OPR/67.0.3575.137"} def iata_sing(city): starting_letter = city[0].upper() iata_single = f"https://en.wikipedia.org/wiki/List_of_airports_by_IATA_airport_code:_{starting_letter}" sin_city = requests.get(url=iata_single, headers=browser_headers) sin_city.raise_for_status() sin_soup = BeautifulSoup(sin_city.content, 'html.parser') main = sin_soup.find('div', id='content').find_all('td') for line in main: if "title=" and city.title() in line.text: iata = line.findPreviousSibling().findPreviousSibling() iata_target = list(iata)[0] # print(iata_target) return iata_target def iata_multi(city): iata_multiple = "https://en.wikipedia.org/wiki/IATA_airport_code#Cities_with_multiple_airports" airport_list = [] city = city.title() cities = requests.get(url=iata_multiple, headers=browser_headers) cities.raise_for_status() soup = BeautifulSoup(cities.content, 'html.parser') # print(soup.prettify()) s = soup.find('div', id='content') body = s.find('div', class_='mw-parser-output') ULs = body.find_all('li') for line in ULs: if city in line.text: for item in line.text: airport_list.append(item) new_list = "".join(airport_list) return new_list try: iata_multi(city) iata_sing(city) except IndexError: print("This appears to be a multi-airport location") iata("paris")
问题原因
- 无返回值传递:外层
iata函数未对内部函数的返回值进行处理,也没有自己的return语句,调用后自然无输出。 - 逻辑顺序错误:try块内仅顺序调用两个内部函数,既没有判断哪个结果有效,也没有将结果传递出去。
- 异常捕获不合理:
IndexError并非多机场场景的必然触发条件,无法正确覆盖业务逻辑。
修复方案与代码
调整函数逻辑,确保返回值正常传递,并优化查询顺序:
import requests from bs4 import BeautifulSoup def iata(city): browser_headers = { "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 OPR/67.0.3575.137"} def iata_sing(city): starting_letter = city[0].upper() iata_single = f"https://en.wikipedia.org/wiki/List_of_airports_by_IATA_airport_code:_{starting_letter}" sin_city = requests.get(url=iata_single, headers=browser_headers) sin_city.raise_for_status() sin_soup = BeautifulSoup(sin_city.content, 'html.parser') main = sin_soup.find('div', id='content').find_all('td') for line in main: if "title=" and city.title() in line.text: iata = line.findPreviousSibling().findPreviousSibling() iata_target = list(iata)[0] return iata_target return None # 未找到单机场时返回None def iata_multi(city): iata_multiple = "https://en.wikipedia.org/wiki/IATA_airport_code#Cities_with_multiple_airports" airport_list = [] city_title = city.title() cities = requests.get(url=iata_multiple, headers=browser_headers) cities.raise_for_status() soup = BeautifulSoup(cities.content, 'html.parser') s = soup.find('div', id='content') body = s.find('div', class_='mw-parser-output') ULs = body.find_all('li') for line in ULs: if city_title in line.text: airport_list.append(line.text.strip()) return "\n".join(airport_list) if airport_list else None # 查询逻辑:先查单机场,无结果再查多机场 single_result = iata_sing(city) if single_result: return single_result multi_result = iata_multi(city) if multi_result: return multi_result return "未找到对应机场的IATA代码" # 测试调用 print(iata("paris")) print(iata("leigh"))
修复要点
- 给内部函数添加
return None分支,明确未找到的状态 - 外层函数按优先级调用内部函数,将有效结果返回
- 优化
iata_multi的结果拼接逻辑,直接添加整行文本,输出更易读 - 移除不合理的try-except,改用基于返回值的业务逻辑判断
内容的提问来源于stack exchange,提问作者Deficient_brain_words
相关产品推荐
相关产品推荐

