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

如何拆分Beautiful Soup爬取的航班字符串:提取时间、城市等信息

航班信息爬取:拆分拼接文本的解决方案

我用Beautiful Soup结合Selenium爬取航班信息时,得到了拼接在一起的字符串:

1:25Allahabad01 h 50 m Non stop13:15Pune
12:40Allahabad07 h 25 m 1 stop via New Delhi20:05Pune

希望拆分成如下格式:

['1:25', 'Allahabad', '01 h 50 m', 'Non stop', '13:15', 'Pune']
['12:40', 'Allahabad', '07 h 25 m', '1 stop via New Delhi', '20:05', 'Pune']

城市名称可能会变化,我考虑用正则但不太熟练,想找更优的实现方案。当前获取字符串的代码如下:

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
url = "https://www.makemytrip.com/flight/search?itinerary=IXD-PNQ-14/07/2022&tripType=O&paxType=A-2_C-0_I-0&intl=false&cabinClass=E&ccde=IN&lang=eng"
driver.get(url)
body = driver.page_source
driver.quit()  # Browser Closed.
soupBody = BeautifulSoup(body)  # Parse the inner HTML using BeautifulSoup
for el in soupBody.find_all('div', attrs={'class': 'timingOptionOuter'}):
    print(el.get_text())

方案一:直接解析HTML子元素(更可靠)

不要直接提取容器的完整文本,而是定位timingOptionOuter下的各个子元素,分别获取对应字段内容。这种方式完全不需要处理拼接字符串,准确率更高,也不受城市名格式变化影响:

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
url = "https://www.makemytrip.com/flight/search?itinerary=IXD-PNQ-14/07/2022&tripType=O&paxType=A-2_C-0_I-0&intl=false&cabinClass=E&ccde=IN&lang=eng"
driver.get(url)
body = driver.page_source
driver.quit()
soupBody = BeautifulSoup(body, 'html.parser')

for el in soupBody.find_all('div', attrs={'class': 'timingOptionOuter'}):
    # 提取各字段内容(类名需根据当前页面实际结构调整)
    dep_time = el.find('div', class_='departureTime').get_text(strip=True)
    dep_city = el.find('div', class_='departureCity').get_text(strip=True)
    duration = el.find('div', class_='duration').get_text(strip=True)
    stops = el.find('div', class_='stopInfo').get_text(strip=True)
    arr_time = el.find('div', class_='arrivalTime').get_text(strip=True)
    arr_city = el.find('div', class_='arrivalCity').get_text(strip=True)
    
    result = [dep_time, dep_city, duration, stops, arr_time, arr_city]
    print(result)

提示:网站类名可能随版本更新变化,建议通过浏览器开发者工具确认当前页面的实际元素类名。

方案二:正则表达式拆分(处理已有的拼接文本)

如果必须处理已获取的拼接字符串,可以基于各字段的格式特征编写正则:

  • 时间:\d{1,2}:\d{2}(1-2位数字+冒号+2位数字)
  • 城市:首字母大写的连续字母或带空格的多段名称
  • 时长:\d{1,2} h \d{2} m
  • 中转信息:包含stop的文本片段

示例代码:

import re

texts = [
    "1:25Allahabad01 h 50 m Non stop13:15Pune",
    "12:40Allahabad07 h 25 m 1 stop via New Delhi20:05Pune"
]

# 适配含空格的城市名的正则
pattern = r'(\d{1,2}:\d{2})([A-Z][a-z]+)(\d{1,2} h \d{2} m)(.*?)(\d{1,2}:\d{2})([A-Z][a-z]+(?: [A-Z][a-z]+)*)'
for text in texts:
    match = re.match(pattern, text)
    if match:
        result = list(match.groups())
        print(result)

内容的提问来源于stack exchange,提问作者vineet singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:03:57