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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:57:59