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

Python爬虫无法同时提取字符串与列表,需获取data-cfemail值

解决Python爬虫提取联系人data-cfemail的问题

嘿,我明白你的问题了——你现在能单独提取企业名称、地址,但联系人部分没法把data-cfemail值包含到列表里对吧?这是因为原来的代码只抓取了文本内容,没去获取邮箱保护标签里的那个属性值,我来给你调整一下代码:

修改后的代码

import requests
from bs4 import BeautifulSoup
import re

link = "https://www.fis.com/fis/companies/details.asp?l=e&filterby=species&specie_id=615&page=1&company_id=160574&country_id="
res = requests.get(link, headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(res.text, 'lxml')

# 提取企业名称和地址
name = soup.select_one("#name").text.strip()
address = soup.select("#description_details tr:contains('Address:') td")[1].text.strip()

contacts = []
# 遍历每个联系人行,跳过空行
for tr in soup.select("#contacts table tr"):
    td_element = tr.select_one("td")
    # 跳过无内容的行
    if not td_element or not td_element.text.strip():
        continue
    
    # 清理td内的文本内容
    cleaned_text = ' '.join(td_element.get_text(strip=True).split())
    # 拆分职位和联系人姓名(用正则匹配Mr/Ms作为分界点)
    match_result = re.match(r"(.*?)(Mr|Ms)\s+(.*)", cleaned_text)
    if match_result:
        # 处理转义的&符号,还原成正常的&
        position = match_result.group(1).replace('&', '&')
        contact_name = f"{match_result.group(2)} {match_result.group(3)}"
    else:
        # 兜底处理(示例里没出现这种情况,以防万一)
        position, contact_name = cleaned_text, ""
    
    # 获取data-cfemail属性值
    cf_email_tag = td_element.select_one("[data-cfemail]")
    cf_email_value = cf_email_tag['data-cfemail'] if cf_email_tag else None
    
    # 组装单个联系人的信息列表
    contact_info = [position, contact_name]
    if cf_email_value:
        contact_info.append(cf_email_value)
    contacts.append(contact_info)

# 打印结果
print(name)
print(address)
print(contacts)

代码说明

  1. 拆分职位与姓名:用正则表达式匹配Mr/Ms作为分界,把混合在一起的职位和姓名拆分开,解决原来文本拼接在一起的问题。
  2. 提取data-cfemail:直接定位带有data-cfemail属性的标签,获取它的属性值——这就是CF反爬保护下的邮箱加密值,符合你的需求。
  3. 跳过空行:排除最后一个无内容的联系人行,避免生成空的列表元素。

预期输出

运行后你会得到类似这样的结果(和你期望的结构一致):

Bahia Grande S.A. - BG Group
Maipú 1252 Piso 8°
[['Founder & President', 'Mr Guillermo Jacob', 'bbdad1dad8d4d9fbd9dad3d2dadcc9dad5dfde95d8d4d695dac9'], ['VP Finance', 'Mr Andres Jacob', '0b61687b6e796a677f6a4b696a63626a6c796a656f6e25686466256a79'], ['Controller', 'Mr Juan Carlos Peralta', '87f1f1eee9f2e2ebe6c7e5e6efeee6e0f5e6e9e3e2a9e4e8eaa9e6f5'], ['VP Admnistration', 'Ms Veronica Vinuela', '...']]

这样处理后,你就可以把这些数据按需求写入CSV的6列中了。

内容的提问来源于stack exchange,提问作者robots.txt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:55