使用BeautifulSoup爬取企业联系方式返回None,是否与span标签有关?
解决你爬取企业联系方式的问题
我看了你的代码和遇到的问题,输出全是None主要有几个核心原因,咱们一步步拆解解决:
1. 选择器范围与ID匹配错误
你在循环里用soup.find()查找联系方式,但soup是整个页面的解析对象,而每个公司的信息都被包裹在对应的div.company-details容器(也就是你循环里的i)里。应该在当前公司的容器内进行查找,同时你之前拼接ID的方式完全错误——循环变量i是BeautifulSoup的Tag对象,转成字符串根本不是页面里真实的ID后缀。
可以改成用ID前缀匹配的方式来定位元素,同时限定查找范围在当前公司容器内:
from bs4 import BeautifulSoup import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } url = "https://www.timesbusinessdirectory.com/company-listings" html = requests.get(url, headers=headers) soup = BeautifulSoup(html.text, 'lxml') for company in soup.find_all('div', class_='col-md-9 col-xs-8 company-details'): # 匹配以valuewebsite_开头的span website_tag = company.find('span', {'id': lambda x: x and x.startswith('valuewebsite_')}) # 匹配以valuephone_开头的span contact_tag = company.find('span', {'id': lambda x: x and x.startswith('valuephone_')}) # 提取文本(如果标签存在的话) website = website_tag.text.strip() if website_tag else "无网站信息" contact = contact_tag.text.strip() if contact_tag else "无联系方式" print(f"网站: {website}, 电话: {contact}")
2. 动态加载的联系方式问题
你提到网页有点击显示号码的功能,这大概率说明联系方式不是直接渲染在静态HTML里的:
- 情况一:真实号码藏在元素的
data-*属性里(比如data-phone),这时候可以直接提取属性值:if contact_tag: real_contact = contact_tag.get('data-phone') # 替换成页面实际的属性名 print(real_contact) - 情况二:号码需要触发JavaScript事件才会加载,这时候
requests就无能为力了(它只能获取静态HTML),得用selenium模拟浏览器行为:from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time driver = webdriver.Chrome() # 需要提前下载对应浏览器的驱动 driver.get("https://www.timesbusinessdirectory.com/company-listings") wait = WebDriverWait(driver, 10) # 等待公司列表加载完成 companies = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'company-details'))) for company in companies: try: # 模拟点击显示号码的按钮(需替换成页面实际的按钮选择器) show_btn = company.find_element(By.CSS_SELECTOR, 'button.show-contact') show_btn.click() time.sleep(0.5) # 等待号码加载 # 获取联系方式 phone = company.find_element(By.CSS_SELECTOR, 'span[id^="valuephone_"]').text website = company.find_element(By.CSS_SELECTOR, 'span[id^="valuewebsite_"]').text print(f"网站: {website}, 电话: {phone}") except Exception as e: print(f"该公司联系方式无法获取: {str(e)}") driver.quit()
3. 额外注意事项
- 记得加请求头模拟浏览器,避免被网站识别为爬虫拦截;
- 可以添加
time.sleep(1)之类的延时,控制请求频率,防止IP被封。
内容的提问来源于stack exchange,提问作者Chow jing lun
相关产品推荐
相关产品推荐

