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
相关产品推荐
相关产品推荐

