如何使用bs4爬取br标签间内容并准确提取企业名称、地址等信息
基于特征匹配的BS4字段提取方案
核心思路
不要依赖br分割后的固定顺序,而是利用每个字段的独有特征做匹配提取,天然兼容地址行数不固定、电话缺失的场景。
具体提取规则
- 企业名称:两个示例中企业名称均被
<b>标签包裹,直接提取blockquote节点下所有<b>标签的文本内容即可,匹配准确率极高。 - 企业官网:官网为标准HTTP/HTTPS链接,可直接提取blockquote下
<a>标签的href属性,也可通过正则匹配文本中以http/https开头的字符串。 - 联系电话:通过电话号码格式正则匹配,示例中为北美号码格式,可根据实际爬取目标的地区调整正则规则,匹配不到则直接判定为无联系电话。
- 企业地址:排除已提取的企业名、电话、官网、以及特殊格式备注(如示例1中
<i>标签包裹的代理人信息)后,剩余的连续非空文本拼接即为完整地址。
可运行代码示例
from bs4 import BeautifulSoup import re def extract_company_info(html_block): soup = BeautifulSoup(html_block, 'html.parser') blockquote = soup.find('blockquote') info = { '企业名称': '', '企业地址': [], '联系电话': '', '企业官网': '' } # 提取企业名 name_tag = blockquote.find('b') if name_tag: info['企业名称'] = name_tag.get_text(strip=True) # 提取官网 a_tag = blockquote.find('a', href=re.compile(r'^https?://')) if a_tag: info['企业官网'] = a_tag['href'].strip() # 电话号码正则(可根据实际场景调整,国内手机号可改为r'^1[3-9]\d{9}$') phone_pattern = re.compile(r'^\(?\d{3}\)?[-\s]?\d{3}[-\s]?\d{4}$') # 提取所有非空文本,过滤空行 all_texts = list(blockquote.stripped_strings) for text in all_texts: # 跳过已提取的企业名、官网 if text == info['企业名称'] or text == info['企业官网']: continue # 匹配电话 if phone_pattern.match(text) and not info['联系电话']: info['联系电话'] = text continue # 跳过斜体备注(示例1的代理人信息) parent_tag = blockquote.find(string=text).parent if parent_tag and parent_tag.name == 'i': continue # 剩余内容加入地址 info['企业地址'].append(text) # 拼接地址 info['企业地址'] = '\n'.join(info['企业地址']).strip() return info
方案兼容性说明
- 遇到地址行数变化、电话缺失的场景均可正常识别,不会出现字段错位问题
- 若爬取目标存在其他格式的备注,新增对应标签/格式的过滤规则即可适配
- 电话号码正则可根据目标地区灵活调整,适配不同国家地区的号码格式
内容的提问来源于stack exchange,提问作者Samyak Sanghvi
相关产品推荐
相关产品推荐

