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

如何将爬取的加油站数据按单站一行最优存储为DataFrame?

如何将每个加油站的信息映射到DataFrame的单独一行

看起来你现在的代码会把所有加油站的<p>标签文本都平铺到一个列表里,导致最终的DataFrame每一行只是单个文本片段,而不是对应一个完整的加油站信息。咱们来调整下代码,让每个加油站的详情对应DataFrame的一行:

修正后的代码

import json
import base64
import pandas as pd
from bs4 import BeautifulSoup, NavigableString

# 假设results是你之前获取的包含objectID的数据源
ids = results["objectID"].tolist()

# 用来存储每个加油站的完整信息,每个元素是一个字典
gas_station_records = []

for idx, station_id in enumerate(ids):
    input_dict = {
         'diff_time_zone': -1,
         'objectID': station_id,
         'poiposition': '50.5397219 8.7328552',
         'stateAll': '2',
         'category': 1,
         'language': 'de',
         'prognosis_offset': -1,
         'windowSize': 305
    }
    
    # 编码请求参数
    encoded_input_string = json.dumps(input_dict, indent=2).encode('utf-8')
    encoded_input_string = base64.b64encode(encoded_input_string).decode("utf-8") 
    
    # 发送请求并解析页面
    r = s.post("https://example.me/getObject_detail.php", headers=headers, data="post=" + encoded_input_string)
    soup = BeautifulSoup(r.text, "lxml")
    inside_div = soup.find('div', class_='inside')
    
    # 收集当前加油站的所有详情文本
    station_details = []
    if inside_div:
        p_tags = inside_div.find_all("p")
        for tag in p_tags:
            # 提取文本并去除多余空格
            txt = tag if isinstance(tag, NavigableString) else tag.text.strip()
            if txt:  # 过滤空内容
                station_details.append(txt)
    
    # 将当前加油站的信息整理成字典,方便转成DataFrame行
    gas_station_records.append({
        "objectID": station_id,
        "full_details": "\n".join(station_details)  # 把所有详情用换行拼接,也可以保留列表形式
        # 如果页面的p标签有固定含义(比如第一个是地址、第二个是电话),可以拆分字段:
        # "address": station_details[0] if len(station_details)>=1 else None,
        # "phone": station_details[1] if len(station_details)>=2 else None,
    })

# 生成最终的DataFrame,每个加油站对应一行
df = pd.DataFrame(gas_station_records)
print(df.head())

关键改动说明

  1. 数据结构调整:把原来的id_details改成存储字典的列表gas_station_records,每个字典对应一个加油站的完整信息,确保每个加油站在列表里是独立的元素。
  2. 单加油站信息收集:针对每个objectID,先把该加油站的所有<p>文本收集到station_details列表里,再和objectID一起打包成字典存入列表。
  3. 过滤无效内容:添加了空文本过滤,避免把页面里的空行或者无意义空格存入数据。

额外小建议

  • 如果爬取的加油站数量较多,建议在循环里加个time.sleep(1)的延迟,避免频繁请求被目标网站封禁IP。
  • 可以加个异常捕获,防止某个加油站的页面解析失败导致整个程序崩溃:
    try:
        inside_div = soup.find('div', class_='inside')
        # 后续的详情收集逻辑...
    except Exception as e:
        print(f"处理加油站ID {station_id}时出错:{str(e)}")
        continue
    

内容的提问来源于stack exchange,提问作者N I

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:16:36