从无href的span元素提取URL及相关数据的技术求助
正确的数据提取方案
原代码的核心问题
- CSS选择器完全不符合页面实际结构(比如
$0、fa-fa.link这类错误的类名) - 直接写入BeautifulSoup对象而非提取文本,导致CSV内容混乱
- 未处理元素不存在的边界情况,容易引发报错
- 手动拼接CSV内容不规范,缺乏对分隔符的处理
修正后的代码
import requests from bs4 import BeautifulSoup import csv # 目标URL url = 'https://www.flavortownusa.com/locations' # 发送请求(添加headers模拟浏览器,避免被拦截) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } page = requests.get(url, headers=headers) page.raise_for_status() # 请求失败时抛出异常 # 解析页面 soup = BeautifulSoup(page.content, 'html.parser') lists = soup.find_all('div', class_='listing-item-inner') # 写入CSV文件 with open('flavortown_locations.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 写入表头 writer.writerow(['门店名称', '地址', '电话', '官网链接']) for item in lists: # 提取门店名称 title = item.find('h3', class_='listing-title').get_text(strip=True) if item.find('h3', class_='listing-title') else '无名称' # 提取地址(对应fa-map-marker图标的span) address_li = item.find('li', class_='address') address = address_li.find('span', class_='text').get_text(strip=True) if address_li else '无地址' # 提取电话(对应fa-phone图标的span) phone_li = item.find('li', class_='phone') phone = phone_li.find('span', class_='text').get_text(strip=True) if phone_li else '无电话' # 提取官网链接(对应fa-link图标的span) link_li = item.find('li', class_='website') website = link_li.find('span', class_='text').get_text(strip=True) if link_li else '无链接' # 写入一行数据 writer.writerow([title, address, phone, website]) print(f"已提取:{title}")
代码说明
- 请求优化:添加
User-Agent模拟浏览器,避免被网站反爬拦截 - 精准选择器:根据页面实际DOM结构,使用正确的类名定位元素(比如
listing-title、address、phone、website这些页面真实存在的类) - 异常处理:通过
if ... else处理元素不存在的情况,避免报错 - 规范CSV写入:使用
csv.writer模块,自动处理分隔符和换行,保证CSV格式正确 - 文本提取:使用
get_text(strip=True)提取并清洗文本内容,去除多余空格和换行
内容的提问来源于stack exchange,提问作者PMelan
相关产品推荐
相关产品推荐

