Python网页爬取问题:无法从P标签提取独立的地址与电话字段
解决同标签内地址和电话的提取问题
我来帮你搞定这个爬虫提取的问题!你现在踩了两个小坑:一是地址把公司名带进来了,二是电话提取的方式不对,导致返回None。咱们一步步来修正:
原代码的问题分析
- 地址部分:你用
split("Phone")[0]会把p标签里从开头到"Phone"的所有内容都捞过来,包括最前面的公司名,所以才会多出"Assemblers Inc."。 - 电话部分:
soup.find("p", text=re.compile("Phone:(.*)"))是在找整个文本完全匹配这个正则的p标签,但实际上p标签里还有公司名和地址,自然找不到,返回None。
修正后的代码
import re import requests from bs4 import BeautifulSoup url = 'https://ams.contractpackaging.org/i4a/memberDirectory/?controller=memberDirectory&action=resultsDetail&directory_id=6&detail_lookup_id=90DB59F83AFA02C0' res = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}) soup = BeautifulSoup(res.text, 'lxml') # 先拿到目标p标签的完整文本,清理多余的换行和空格 detail_text = soup.find(class_="memeberDirectory_details").find("p").text.strip() # 按换行分割成干净的行列表(去掉空行和首尾空格) clean_lines = [line.strip() for line in detail_text.split('\n') if line.strip()] # 提取地址:跳过第一行的公司名,收集到Phone行之前的内容 address_parts = [] for line in clean_lines: if line.startswith('Phone:'): break address_parts.append(line) # 去掉第一个元素(公司名),合并成完整地址 address = ' '.join(address_parts[1:]) # 提取电话:用正则匹配Phone:后面的内容 phone_match = re.search(r'Phone:\s*(.*)', detail_text) phone = phone_match.group(1) if phone_match else '未找到电话信息' # 输出期望的结果 print(f"{address} {phone}")
代码逻辑说明
- 清理文本:先把p标签里的文本处理干净,去掉多余的换行和空格,得到清晰的行列表。
- 提取地址:遍历行列表,跳过第一行的公司名,把后面到"Phone:"之前的内容合并成地址。
- 提取电话:用正则表达式精准匹配"Phone:"后面的内容,不管前面有多少内容都能拿到电话。
运行这段代码后,就能得到你想要的结果:2850 West Columbus Ave. Chicago IL 60652 UNITED STATES (773) 378-3000
内容的提问来源于stack exchange,提问作者MITHU
相关产品推荐
相关产品推荐

