Python使用BeautifulSoup抓取div内容时无对应标签返回空值求助
Python爬虫提取网页指定字段的解决方案
问题根因
- 结束日期未被独立HTML标签包裹,属于
<div class="cd-info">下的原生文本节点,原有代码调用.string无法获取混合标签结构中的零散文本内容 - 行程描述是当前div下的第二个
<b>标签,原有代码仅提取了第一个<b>标签的内容作为开始日期,遗漏了第二个<b>节点
代码调整方案
你只需要修改遍历cruise_div的循环逻辑即可,调整后完整代码如下:
import requests from bs4 import BeautifulSoup import pandas as pd import re # 新增导入正则模块,用于匹配日期格式 url = "https://www.cruisetimetables.com/cruisesearch.html?id=cse&sailmonth=Jul%202021&destination=Any&departureport=&arrivalport=&openjawcruise=&portofcall=&cruiseship=&duration=Any&chartercruise=" headers = {"Accept-Language": "en-US, en;q=0.5"} results = requests.get(url, headers=headers) soup = BeautifulSoup(results.text, "html.parser") # 初始化数据存储 cruisestartdate = [] cruiseenddate = [] itinerarydescription = [] cruiseshipname = [] cruise_div = soup.find_all('div', class_='cd-info') # 遍历每个容器提取字段 for container in cruise_div: # 提取所有b标签,分别对应开始日期、行程描述 b_tags = container.find_all('b') # 1. 开始日期 startdate = b_tags[0].text.strip() cruisestartdate.append(startdate) # 2. 结束日期:从div全部文本中正则匹配日期格式 all_text = container.get_text(strip=False) end_match = re.search(r'To\s*(\w{3}\s\d{1,2}\s\w{3}\s\d{4})', all_text) enddate = end_match.group(1) if end_match else '' cruiseenddate.append(enddate) # 3. 行程描述 itinerary = b_tags[1].text.strip() itinerarydescription.append(itinerary) # 4. 船舶名称 ship = container.a.text.strip() cruiseshipname.append(ship) # 构建DataFrame cruise = pd.DataFrame({ 'Sail Date': cruisestartdate, 'End Date': cruiseenddate, 'Description': itinerarydescription, 'Ship Name': cruiseshipname, }) # 打印验证 print(cruise)
运行效果
调整后运行代码,即可正常输出四个字段的内容,对应你提供的示例HTML会得到如下结果:
- 开始日期:
Sat 31 Jul 2021 - 结束日期:
Fri 20 Aug 2021 - 行程描述:
20 Night New! Malta, The Adriatic & Greece - 船舶名称:
Viking Sea
内容的提问来源于stack exchange,提问作者viperone
相关产品推荐
相关产品推荐

