You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

代码逻辑说明

  1. 清理文本:先把p标签里的文本处理干净,去掉多余的换行和空格,得到清晰的行列表。
  2. 提取地址:遍历行列表,跳过第一行的公司名,把后面到"Phone:"之前的内容合并成地址。
  3. 提取电话:用正则表达式精准匹配"Phone:"后面的内容,不管前面有多少内容都能拿到电话。

运行这段代码后,就能得到你想要的结果:2850 West Columbus Ave. Chicago IL 60652 UNITED STATES (773) 378-3000

内容的提问来源于stack exchange,提问作者MITHU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:55:27