如何用BS4格式化网页爬取数据:调整地址输出为结构化表格
修改方案:将Aldi约克门店地址拆分为结构化表格
核心思路
- 按单门店地址组提取原始数据(每个门店对应街道、城市、邮编3段文本)
- 将分组后的地址映射到
line1/city/postcode字段,用pandas生成结构化表格
修改后的完整代码
import requests from bs4 import BeautifulSoup import pandas as pd # 1. 请求目标页面(替换为Aldi约克门店列表的实际URL) url = "https://www.aldi.co.uk/stores/york" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 2. 提取所有地址文本(需根据实际页面结构调整选择器) # 示例:假设地址存放在class为"store-address"的容器下的<p>标签中 address_elements = soup.select(".store-address p") address_texts = [elem.get_text(strip=True) for elem in address_elements] # 3. 按单门店拆分地址(每3项对应一个门店的街道/城市/邮编) store_addresses = [] for i in range(0, len(address_texts), 3): # 避免索引越界,仅当存在完整的3项时添加数据 if i + 2 < len(address_texts): store_addresses.append({ "line1": address_texts[i], "city": address_texts[i+1], "postcode": address_texts[i+2] }) # 4. 生成结构化表格并输出 df = pd.DataFrame(store_addresses) print(df) # 可选:保存为CSV文件 df.to_csv("aldi_york_stores.csv", index=False)
关键调整说明
地址拆分逻辑适配:
- 如果门店地址是单个带换行的字符串(如
"123 High Street\nYork\nYO1 2AB"),替换步骤3的代码为:store_addresses = [] for addr_str in address_texts: parts = addr_str.split("\n") if len(parts) >= 3: store_addresses.append({ "line1": parts[0].strip(), "city": parts[1].strip(), "postcode": parts[2].strip() })
- 如果门店地址是单个带换行的字符串(如
页面选择器校准:
- 用浏览器开发者工具查看门店地址的HTML结构,调整
soup.select()的参数(比如替换.store-address p为实际的标签/类名组合)。
- 用浏览器开发者工具查看门店地址的HTML结构,调整
异常防护:
- 添加长度校验逻辑,避免因页面结构变动导致的索引越界问题。
内容的提问来源于stack exchange,提问作者S L
相关产品推荐
相关产品推荐

