gpt4 book ai didi

python - 使用 Python 中的 Pandas 模块将从网站提取的项目写入具有不同长度列表的 .xls 工作表

转载 作者:行者123 更新时间:2023-12-01 01:05:23 25 4
gpt4 key购买 nike

我是 Python 编程的初学者,我正在练习从网站上抓取不同的值。我已从特定网站提取了这些项目,现在想将它们写入 .xls 文件。

整个网页有 714 条记录,包括重复记录,但 Excel 工作表仅显示 707 条记录,因为 zip() 函数会在最小列表耗尽时停止。这里最小的列表是电子邮件列表。因此,由于 zip() 函数的属性,它已经耗尽并且迭代停止。我什至在 if 条件下对没有电子邮件地址的记录进行检查,以便它显示“没有电子邮件地址”,但仍然相同的结果会显示为 704,并且有重复的记录。请告诉我哪里出了问题,如果可能的话,请建议如何删除重复记录并在没有电子邮件的地方显示“无电子邮件地址”。

from bs4 import BeautifulSoup as bs
import pandas as pd

res = 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 工作表

Ray White Excel Sheet

最佳答案

看起来您正在执行许多 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)

上面是我用来创建数据框的一些示例代码。这里的关键是在 "class":"card Horizo​​ntal-split vcard"}

上执行一个 find_all

希望这对您有所帮助。

干杯,亚当

关于python - 使用 Python 中的 Pandas 模块将从网站提取的项目写入具有不同长度列表的 .xls 工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55412364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com