使用BeautifulSoup从HTML的p标签中提取指定地址文本的方法
解决方法
你可以通过两个判断条件精准定位地址p标签:一是筛选没有任何自定义属性的p标签,二是用正则匹配美国标准地址格式(城市+州缩写+5位邮编),避免误提取空标签或者其他无属性p标签的内容。
修改后的完整代码
import requests from bs4 import BeautifulSoup import re limit = 25 url = f'https://www.counselingcalifornia.com/cc/cgi-bin/utilities.dll/customlist?FIRSTNAME=~&LASTNAME=~&ZIP=&DONORCLASSSTT=&_MULTIPLE_INSURANCE=&HASPHOTOFLG=&_MULTIPLE_EMPHASIS=ÐNIC=&_MULTIPLE_LANGUAGE=ENG&QNAME=THERAPISTLIST&WMT=NONE&WNR=NONE&WHP=therapistHeader.htm&WBP=therapistList.htm&RANGE=1%2F{limit}&SORT=LASTNAME' headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Mobile Safari/537.36'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') rows = soup.find_all('div', {'class':'row'}) address_list = [] # 美国地址正则:匹配 任意字符, 两位大写字母 五位数字 的格式 addr_pattern = re.compile(r'.+,\s*[A-Z]{2}\s*\d{5}') for row in rows: t=row.find_all('div',class_='col-sm-3') for i in t: p_tags = i.find_all('p') for p in p_tags: # 第一个条件:p标签没有任何属性 if not p.attrs: text = p.get_text(strip=True) # 第二个条件:文本符合地址格式 if addr_pattern.match(text): address_list.append(text) print(text)
逻辑说明
- 筛选无属性p标签:BeautifulSoup的标签对象的
attrs属性会返回该标签所有属性的字典,如果字典为空就说明该p标签没有class、id、style等额外属性,符合地址标签的特征 - 正则校验:避免拿到空的无属性p标签,或者其他不符合地址格式的内容,正则
r'.+,\s*[A-Z]{2}\s*\d{5}'可以匹配所有「任意内容+逗号+空格+两位大写州缩写+空格+5位邮编」的标准美国地址格式 - 提取的所有地址会存在
address_list列表中,后续可直接导出为csv或其他格式使用
内容的提问来源于stack exchange,提问作者Amen Aziz
相关产品推荐
相关产品推荐

