如何合并两个网页抓取列表?解决仅显示单个实例的问题
解决场馆名称与地址一一配对显示的问题
嘿,我来帮你搞定这个问题!你已经成功抓取到了所有场馆名称和对应地址的数据,但之前的代码逻辑导致最后只能输出最后一组结果——因为你是分别遍历两组数据,循环结束后venue和info变量只会保留最后一次循环的元素。我们只需要调整一下代码,把两组数据配对遍历就能解决。
问题根源
你之前的代码是先单独遍历所有场馆名称,再单独遍历所有地址信息,这两个循环跑完后,venue和info变量仅存储最后一次循环的内容,直接打印自然只能看到最后一组数据。
修复方案
我们先把抓取到的场馆名称和地址分别存入列表,再用zip()函数同时遍历两个列表,实现一一对应输出。顺便还能清理一下地址文本里的冗余格式,让输出更美观。
完整代码示例
from bs4 import BeautifulSoup import urllib.request def get_HTML(url): response = urllib.request.urlopen(url) html = response.read() return html # 解析目标页面 venues_html = get_HTML('http://www.cxra.com/venues/new-york/') soup = BeautifulSoup(venues_html, "lxml") # 收集所有场馆名称到列表 venue_names = [] for venue in soup.find_all('a', attrs={'href' : '#', 'onclick' : 'return false;'}): # 去除文本前后多余空白 venue_names.append(venue.text.strip()) # 收集并清理所有地址信息到列表 venue_addresses = [] for info in soup.find_all('div', attrs={'class' : 'infoUnit col-md-6'}): # 把换行、回车和连续空格替换成单个空格,再去除首尾空白 cleaned_address = ' '.join(info.text.split()).strip() venue_addresses.append(cleaned_address) # 一一配对输出每组场馆和地址 for name, address in zip(venue_names, venue_addresses): print(f"场馆名称: {name}") print(f"地址信息: {address}\n")
代码说明
- 收集数据到列表:不再直接打印抓取内容,而是把场馆名称和清理后的地址分别存入
venue_names和venue_addresses列表,保存所有抓取到的数据; - 使用
zip()配对遍历:zip()函数会将两个列表中对应位置的元素打包成元组,循环时每次就能拿到一组对应的场馆名称和地址; - 文本格式清理:通过
split()和join()方法去掉地址文本里的换行、回车和多余空格,让输出更整洁易读。
预期输出
运行代码后,你会看到所有场馆和对应地址的一一展示:
场馆名称: Manhattan Center Studios 地址信息: 311 West 34th Street New York City, 94710 212.613.5536 场馆名称: Ellis Island 地址信息: Ellis Island New York, NY 10004 212.613.5535 场馆名称: The TimesCenter 地址信息: 242 W 41st St New York, NY 10036 212.613.5535 场馆名称: The Altman Building 地址信息: 135 W 18th St New York, NY 10011 212.613.5535 场馆名称: NYIT Auditorium on Broadway 地址信息: 1871 Broadway New York, NY 10023 212.613.5536
内容的提问来源于stack exchange,提问作者Aiden Bird
相关产品推荐
相关产品推荐

