为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Python 中的 Pandas 模块将来自网站的提取项目写入具有不同长度列表的 .xls 表

使用 Python 中的 Pandas 模块将来自网站的提取项目写入具有不同长度列表的 .xls 表

守着一只汪 2021-12-21 16:20:21
我是 Python 编程的初学者,我正在练习从网站上抓取不同的值。我已经从特定网站提取了项目,现在想将它们写入 .xls 文件。整个网页有 714 条记录,包括重复记录,但由于 zip() 函数在最小列表耗尽时停止,因此 Excel 表仅显示 707 条记录。这里最小的列表是电子邮件列表。因此,由于 zip() 函数的属性,它变得筋疲力尽并且迭代停止。我什至在 if 条件下对没有电子邮件地址的记录进行了检查,以便它显示“无电子邮件地址”但仍然相同的结果显示为 704 且有重复记录。请告诉我哪里出错了,如果可能的话,建议如何删除重复记录并在没有电子邮件的地方显示“无电子邮件地址”。from bs4 import BeautifulSoup as bsimport pandas as pdres = requests.get('https://www.raywhite.com/contact/?type=People&target=people&suburb=Sydney%2C+NSW+2000&radius=50%27%27&firstname=&lastname=&_so=contact', headers = {'User-agent': 'Super Bot 9000'})soup = bs(res.content, 'lxml')names=[]positions=[]phone=[]emails=[]links=[l1['href'] for l1 in soup.select('.agent-name a')]nlist = soup.find_all('li', class_='agent-name')plist= soup.find_all('li',class_='agent-role')phlist = soup.find_all('li', class_='agent-officenum')elist = soup.find_all('a',class_='val withicon')for n1 in nlist:    names.append(n1.text)for p1 in plist:    positions.append(p1.text)for ph1 in phlist:    phone.append(ph1.text)for e1 in elist:    emails.append(e1.get('href') if e1.get('href') is not None else 'No Email address')df = pd.DataFrame(list(zip(names,positions,phone,emails,links)),columns=['Names','Position','Phone','Email','Link'])df.to_excel(r'C:\Users\laptop\Desktop\RayWhite.xls', sheet_name='MyData2', index = False, header=True)excel表看起来像这样,我们可以看到最后的记录名称,但它的电子邮件地址不匹配:雷白 Excel 表
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

看起来您正在执行许多 find_all 操作,然后将它们拼接在一起。我的建议是做一个 find_all 然后迭代它。当所有数据都在一个地方时,它可以更容易地构建数据框的列。


我已更新以下代码以成功提取链接而不会出错。对于任何代码,都有多种方法可以执行相同的任务。这可能不是最优雅的,但它确实完成了工作。


import requests

from bs4 import BeautifulSoup 

import pandas as pd


r    = requests.get('https://www.raywhite.com/contact/?type=People&target=people&suburb=Sydney%2C+NSW+2000&radius=50%27%27&firstname=&lastname=&_so=contact', headers = {'User-agent': 'Super Bot 9000'})

soup = BeautifulSoup(r.text, 'html.parser')


get_cards = soup.find_all("div",{"class":"card horizontal-split vcard"})


agent_list = []


for item in get_cards:

    name      = item.find('li', class_='agent-name').text

    position  = item.find('li', class_='agent-role').text

    phone     = item.find('li', class_='agent-officenum').text

    link      = item.find('li', class_='agent-name').a['href']


    try:

        email = item.find('a',class_='val withicon')['href'].replace('mailto:','')

    except:

        email = 'No Email address'

    agent_list.append({'name':name,'position':position,'email':email,'link':link})


df = pd.DataFrame(agent_list)


以上是我为创建数据框而放在一起的一些示例代码。这里的关键是做一个 find_all"class":"card horizontal-split vcard"}


希望有所帮助。


干杯,亚当


查看完整回答
反对 回复 2021-12-21
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信