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

Python遍历URL列表时循环仅执行第一个元素的问题求助

Python遍历URL列表时循环仅执行第一个元素的问题求助

嗨,我一眼就发现你代码里的关键问题啦,咱们一步步来解决:

最核心的错误:循环内硬编码了URL

你第一个for循环里写了这行:

url = url_list_str[0]

这就相当于每次循环都强制把url变量改成列表的第一个元素,完全忽略了循环变量url本来应该遍历的列表项!不管循环跑多少次,都只会处理第一个URL,自然只会得到第一个结果。把这行删掉就解决了循环遍历的问题~

第二个小问题:DataFrame会被重复覆盖

原来的代码每次循环都执行df = pd.DataFrame([data]),这会每次创建一个新的DataFrame,把之前的结果覆盖掉。就算循环正常遍历了所有URL,最后导出的CSV也只会保留最后一个URL的数据。正确的做法是先把所有URL的数据收集到一个列表里,最后再统一转换成DataFrame。

修正后的完整代码示例

import requests as req
from bs4 import BeautifulSoup
import pandas as pd
import json
from time import sleep  # 假设你用的sleep和你的pause功能一致

def foodpanda_data(html):
    script_tag = html.find("script", {"data-testid": "restaurant-seo-schema"})
    json_text = script_tag.string
    json_dict = json.loads(json_text)
    extracted_data = {}
    keys_to_extract = ["Name", "streetAddress", "addressLocality", "postalCode", "latitude", "longitude", "url", "ratingValue", "ratingCount", "bestRating", "worstRating", "servesCuisine", "priceRange"]
    
    for key in keys_to_extract:
        if key.lower() == 'name':
            extracted_data[key] = json_dict.get('name', '')
        # 这里保留你原本其他key的处理逻辑即可
        # 也可以简化成统一处理:extracted_data[key] = json_dict.get(key.lower(), '')
    return extracted_data

url_list_str = [
    'https://www.foodpanda.ph/restaurant/vh2d/sicilian-roast-legaspi-village',
    'https://www.foodpanda.ph/restaurant/ns76/tokyo-milk-cheese-factory-greenbelt-5',
    'https://www.foodpanda.ph/restaurant/hksd/paul-greenbelt-5'
]

# 初始化空列表,用来存储所有餐厅的数据
all_restaurant_data = []

headers = {}  # 替换成你的实际请求头

for url in url_list_str:
    # 删掉那行错误的url = url_list_str[0]!!
    response = req.get(url, headers=headers)
    sleep(5)  # 保持请求间隔,避免被限制
    html = BeautifulSoup(response.content, 'html.parser')
    data = foodpanda_data(html)
    # 把当前餐厅的数据添加到列表中
    all_restaurant_data.append(data)

# 把所有数据一次性转换成DataFrame
df = pd.DataFrame(all_restaurant_data)
# 导出到CSV
df.to_csv('foodpanda_restaurants.csv', index=False)

关于你尝试的第二种循环写法

你试的for u in range(len(url_list_str)):写法本身是没问题的,只要删掉硬编码的url = url_list_str[0],改成url = url_list_str[u],再配合收集数据到列表的逻辑,也能正常工作。不过更Pythonic的写法还是直接遍历列表元素for url in url_list_str:~

备注:内容来源于stack exchange,提问作者user1366487

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:18:08