2016-08-18 141 views
0

我在从网上抓取数据时从列表中创建熊猫df时遇到了一些麻烦。在这里,我使用beautifulsoup从localharvest.org(农场名称,城市和描述)中提取有关本地农场的一些信息。我能够有效地抓取数据,在每次传递中创建一个对象列表。我遇到的麻烦是将这些列表输出到表格df中。从列表中创建熊猫数据框的麻烦

我的完整代码如下:

import requests 
from bs4 import BeautifulSoup 
import pandas 

url = "http://www.localharvest.org/search.jsp?jmp&lat=44.80798&lon=-69.22736&scale=8&ty=6" 
r = requests.get(url) 
soup = BeautifulSoup(r.content) 


data = soup.find_all("div", {'class': 'membercell'}) 

fname = [] 
fcity = [] 
fdesc = [] 

for item in data: 
    name = item.contents[1].text 
    fname.append(name) 
    city = item.contents[3].text 
    fcity.append(city) 
    desc = item.find_all("div", {'class': 'short-desc'})[0].text 
    fdesc.append(desc) 

df = pandas.DataFrame({'fname': fname, 'fcity': fcity, 'fdesc': fdesc}) 

print (df) 

df.to_csv('farmdata.csv') 

有趣的是,print(df)功能表明,所有三个名单已传递到数据帧。但结果.CSV输出仅包含一列值(fcity),其中存在fname和fdesc列标签。 Interstingly,如果我做了一些疯狂的事情,比如试图强制标签描述的输出为df.to_csv('farmdata.csv', sep='\t'),我得到一个带有混乱输出的列,但它至少会传递数据框的其他元素。

先感谢您的任何输入。

回答

1

尝试剥离出换行和空格字符:

import requests 
from bs4 import BeautifulSoup 
import pandas 

url = "http://www.localharvest.org/search.jsp?jmp&lat=44.80798&lon=-69.22736&scale=8&ty=6" 
r = requests.get(url) 
soup = BeautifulSoup(r.content) 


data = soup.find_all("div", {'class': 'membercell'}) 

fname = [] 
fcity = [] 
fdesc = [] 

for item in data: 
    name = item.contents[1].text.split() 
    fname.append(' '.join(name)) 
    city = item.contents[3].text.split() 
    fcity.append(' '.join(city)) 
    desc = item.find_all("div", {'class': 'short-desc'})[0].text.split() 
    fdesc.append(' '.join(desc)) 

df = pandas.DataFrame({'fname': fname, 'fcity': fcity, 'fdesc': fdesc}) 

print (df) 

df.to_csv('farmdata.csv') 
+1

这工作完美。我认为问题来自desc领域。我注意到beautifulsoup往往会添加大量的换行符。其他人主张使用'.split()'去除换行符。这是一个很大的帮助。谢谢。 – JeremyD

+0

如果您使用电子表格程序查看csv文件,我猜测换行符会使它看起来像单元格为空,而实际上它只显示第一个(空)行。真高兴你做到了。请考虑upvoting和/或[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)您找到有用的答案:) – zarak

1

它为我的作品:

# Taking a few slices of each substring of a given string after stripping off whitespaces 
df['fname'] = df['fname'].str.strip().str.slice(start=0, stop=20) 
df['fdesc'] = df['fdesc'].str.strip().str.slice(start=0, stop=20) 
df.to_csv('farmdata.csv') 
df 

       fcity     fdesc     fname 
0 South Portland, ME Gromaine Farm is pro   Gromaine Farm 
1   Newport, ME We are a diversified Parker Family Farm 
2   Unity, ME The Buckle Farm is a  The Buckle Farm 
3  Kenduskeag, ME Visit wiseacresfarm.  Wise Acres Farm 
4  Winterport, ME Winter Cove Farm is  Winter Cove Farm 
5   Albion, ME MISTY BROOK FARM off  Misty Brook Farm 
6 Dover-Foxcroft, ME We want you to becom   Ripley Farm 
7   Madison, ME Hide and Go Peep Far Hide and Go Peep Far 
8   Etna, ME Fail Better Farm is  Fail Better Farm 
9  Pittsfield, ME We are a family farm Snakeroot Organic Fa 

也许你有很多这是由默认的分隔符误解空的空间(),并因为它包含因此拿起fcity柱()在这导致订购受到影响。

+1

这也适用

熊猫方法。剥去过多的换行符和空格似乎是关键。感谢您的帮助! – JeremyD

0

请考虑使用字典列表或字典词典,而不是使用您所搜索的每个农场实体的信息列表。例如:

[{name:farm1, city: San Jose... etc}, 
{name: farm2, city: Oakland...etc}] 

现在,你可以在上面定义的类型的字典列表上调用Pandas.DataFrame.from_dict()http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.from_dict.html

可能会更详细地描述这种解决方案的答案:Convert Python dict into a dataframe