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)
代码说明
- 拆分职位与姓名:用正则表达式匹配
Mr/Ms作为分界,把混合在一起的职位和姓名拆分开,解决原来文本拼接在一起的问题。 - 提取data-cfemail:直接定位带有
data-cfemail属性的标签,获取它的属性值——这就是CF反爬保护下的邮箱加密值,符合你的需求。 - 跳过空行:排除最后一个无内容的联系人行,避免生成空的列表元素。
预期输出
运行后你会得到类似这样的结果(和你期望的结构一致):
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
相关产品推荐
相关产品推荐

