BeautifulSoup.find_all()如何筛选item_teaser属性含指定前缀邮编的标签
爬虫代码修正实现方案
原代码问题说明
- 缺失
requests库导入语句,无法发起网络请求 - 解析XML数据误用了HTML解析器,应使用XML专用解析器保证标签属性识别准确
find_all(id="item_teaser")语法错误:你要筛选的是带有item_teaser属性的<item>标签,而非id属性等于item_teaser的元素- 没有实现邮编前缀匹配的过滤逻辑
修正后可运行代码
import requests import re from bs4 import BeautifulSoup url = "http://www.ontariogolf.com/app/map/cfeed.php?e=-63&w=-106&n=55&s=36" # 发起请求加超时避免卡住 xml_resp = requests.get(url, timeout=10) # 用XML解析器解析内容 soup = BeautifulSoup(xml_resp.content, 'xml') # 定义要匹配的邮编前缀集合,可自行增减需要的前缀 target_prefix = {'L7J', 'L2S', 'L2O'} # 存储符合条件的item标签 result_items = [] # 遍历所有item标签 for item in soup.find_all('item'): # 拿到item_teaser属性值,不存在则返回空字符串 teaser = item.get('item_teaser', '') # 正则匹配加拿大邮编前3位,匹配规则为:字母+数字+字母 后接空格+后半段邮编,放在字符串末尾 match = re.search(r'([A-Z]\d[A-Z]) \d[A-Z]\d$', teaser) if match: post_prefix = match.group(1) if post_prefix in target_prefix: result_items.append(item) # 打印符合要求的完整item标签 for item in result_items: print(item)
逻辑说明
- 用XML解析器解析响应内容,保证
<item>标签的自定义属性可以被正常读取 - 先全量获取所有
<item>标签,再逐个校验item_teaser属性的邮编前缀 - 用正则匹配邮编格式,避免地址中其他空格/字符干扰前缀提取,匹配准确率更高
内容的提问来源于stack exchange,提问作者Senad H
相关产品推荐
相关产品推荐

