Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python中的Pandas模块将从网站提取的项目写入具有不同长度列表的.xls工作表_Python_Excel_Pandas_Web Scraping_Beautifulsoup - Fatal编程技术网

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

使用Python中的Pandas模块将从网站提取的项目写入具有不同长度列表的.xls工作表,python,excel,pandas,web-scraping,beautifulsoup,Python,Excel,Pandas,Web Scraping,Beautifulsoup,我是Python编程的初学者,我正在练习从网站上抓取不同的值。 我已经从一个特定的网站中提取了这些项目,现在想将它们写入一个.xls文件中 整个网页有714条记录,包括重复记录,但excel工作表仅显示707条记录,因为zip()函数在最小的列表用尽时停止。这里最小的列表是电子邮件列表。由于zip()函数的属性,它已经耗尽,迭代也停止了。我甚至在if条件下对没有电子邮件地址的记录进行了检查,这样它就显示“没有电子邮件地址”,但对于704,同样的结果显示为重复记录。请告诉我哪里出了问题,如果可能的

我是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表


看起来你正在做很多“全部查找”,然后将它们缝合在一起。我的建议是做一个查找所有,然后迭代。当所有数据都在一个地方时,构建数据帧的列会变得容易得多

我已经更新了下面的代码,成功地提取链接没有错误。对于任何代码,都有许多方法来执行相同的任务。这个可能不是最优雅的,但它确实完成了任务

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)

上面是我为创建dataframe而编写的一些示例代码。这里的关键是在
“类”:“卡水平拆分vcard”}

希望这能有所帮助

干杯, 亚当