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

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")

问题原因

  1. 无返回值传递:外层iata函数未对内部函数的返回值进行处理,也没有自己的return语句,调用后自然无输出。
  2. 逻辑顺序错误:try块内仅顺序调用两个内部函数,既没有判断哪个结果有效,也没有将结果传递出去。
  3. 异常捕获不合理: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:20:25