2016-08-18 8 views
0

ウェブからデータをスクラップしながら生成するリストからパンダを作成する際に問題があります。ここで私は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)機能は、すべての3つのリストは、データフレームに渡されたことを示しています。しかし、結果の.CSV出力には、fnameおよびfdesc列ラベルが存在する単一列の値(fcity)のみが含まれます。間違いなく、タブの描画出力を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および/または[accepting](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

あなたがスクラップしたファームエンティティごとに情報のリストを使用する代わりに、辞書のリストを使用するか、またはdictsのdictを使用することを検討してください。例えば:

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

今、あなたはdictsの上で定義されたリストにPandas.DataFrame.from_dict()を呼び出すことができます。

パンダ方法:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.from_dict.html

より詳細にこのソリューションを記述かもしれない答え:Convert Python dict into a dataframe

関連する問題