python - 无法同时抓取字符串和列表
问题描述
我正在尝试使用 python 脚本从网页获取name
,address
和。key contacts
我可以以正确的方式单独获取它们。但是,我想要做的是获取name
和address
作为字符串和列表中的关键联系人,以便我可以将它们写入 6 列的 csv 文件中。我找不到任何方法将 的值包含data-cfemail
在联系人列表中。
我试过:
import requests
from bs4 import BeautifulSoup
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
contacts = [' '.join(item.get_text(strip=True).split()) for item in soup.select("#contacts table tr td")]
print(name,address,contacts)
电流输出:
Bahia Grande S.A. - BG Group
Maipú 1252 Piso 8°
['Founder & PresidentMr Guillermo Jacob', 'VP FinanceMr Andres Jacob[email protected]', 'ControllerMr Juan Carlos Peralta[email protected]', 'VP AdmnistrationMs Veronica Vinuela[email protected]', '']
预期输出(因为电子邮件受到保护,所以值data-cfemail
会做):
Bahia Grande S.A. - BG Group
Maipú 1252 Piso 8°
[Founder & President, Mr Guillermo Jacob]
[VP Finance, Mr Andres Jacob,bbdad1dad8d4d9fbd9dad3d2dadcc9dad5dfde95d8d4d695dac9]
[Controller,Mr Juan Carlos Peralta,0b61687b6e796a677f6a4b696a63626a6c796a656f6e25686466256a79]
[VP Admnistration,Ms Veronica Vinuela,87f1f1eee9f2e2ebe6c7e5e6efeee6e0f5e6e9e3e2a9e4e8eaa9e6f5]
解决方案
您可以通过以下方式限制到适当的 tds #contacts td[height]
,然后是适当的 ids
td.select('#contacts_title, #contacts_name, #contacts_email')
,然后在列表理解中进行测试,如果 current 具有 cfemail 并相应地采取行动。
from bs4 import BeautifulSoup as bs
import requests
r = requests.get('https://www.fis.com/fis/companies/details.asp?l=e&filterby=species&specie_id=615&page=1&company_id=160574&country_id=')
soup = bs(r.content, 'lxml')
name = soup.select_one('#name').text.strip()
address = soup.select_one('#description_details td:contains("Address:") + td div').text
print(name)
print(address)
for td in soup.select('#contacts td[height]'):
print([i.text.strip().replace('\xa0',' ') if i.select_one('.__cf_email__') is None else i.select_one('.__cf_email__')['data-cfemail']
for i in td.select('#contacts_title, #contacts_name, #contacts_email')])
OP的实现:
contacts = [', '.join([i.text.strip().replace('\xa0',' ') if i.select_one('.__cf_email__') is None else i.select_one('.__cf_email__')['data-cfemail'] for i in td.select('#contacts_title, #contacts_name, #contacts_email')]) for td in soup.select('#contacts td[height]')]
推荐阅读
- vba - 类型不匹配将字符串转换为日期
- java - 如何使用游标从sqlite android中的多个列中获取数据
- apache-spark - 使用 pyspark 将字符串转换为日期时间时为空值
- vba - 记录的一些 Array 公式未转换为公式,而是保留为 RC 格式
- c++ - 在 RISC-V 中这条指令执行结束时 x12 的值是多少?(没有 RARS)
- javascript - 脚本仅在调用 alert() 时有效
- reactjs - WebRTC React Native 在 IOS 上给出异常
- android - Unity Google 移动广告 Mediatiod MoPub 构建错误 Android 和 iOS
- reactjs - TypeScript 不能正确匹配条件类型
- javascript - 在 JavaScript 数组中添加变量