如何拆分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
相关产品推荐
相关产品推荐

