2016-12-01 16 views
0

私の質問は単純です:上記のどちらのコマンドも文字列を複数の行に分割することができない場合は、文字列?split( " n")もsplitlines()も文字列を分割しません

私の例はかなり深いですが、要約すると、私はBeautifulSoupでHTMLテーブルから特定のデータを解析しましたが、データを印刷するときれいな表形式ではなく、むしろ1つの面倒な文字列です。私はそれをPandas DataFrameに変換しようとしましたが、まだ成功しませんでした。私はその後、出力を整理するために上記のコマンドを使用してみましたが、それらも失敗しました。これはすべて、実際にはデリミタを持たない連続した文字列でなければならないと私に信じさせています。

私はこの問題について助けてくれるでしょう。間違ったコマンドを使用しているかどうか、あるいは私のデータが本当にこのように扱いにくいのかどうかはわかりません。ありがとうございました。

マイデータ(と私は期待してどのようにそれを印刷しなければならない):

desired output

私の関連するコード:印刷されますどのような

rows = table.findAll("tr")[1:2] 
data = { 
    'ID' : [], 
    'Available Quota' : [], 
    'Live Weight Pounds' : [], 
    'Price' : [], 
    'Date Posted' : [] 
} 

for row in rows: 
    cols = row.findAll("td") 
    data['ID'].append(cols[0].get_text()) 
    data['Available Quota'].append(cols[1].get_text()) 
    data['Live Weight Pounds'].append(cols[2].get_text()) 
    data['Price'].append(cols[3].get_text()) 
    data['Date Posted'].append(cols[4].get_text()) 

fishData = pd.DataFrame(data) 
#print(fishData) 
str1 = ''.join(data['Available Quota']) 
#print(type(str1)) 
#str1.split("\n") 
str1.splitlines() 
print(str1) 

GOM CODGOM HADDDABSGOM YT 
+0

あなたは 'split/splitlines'を間違って使用していますが、いずれにしてもそれはあなたが印刷した1行だけなので、助けにはなりません。なぜ最初にデータに加わったのですか?あなたはすでに適切な構造でそれを持っていたようです。 –

+0

私はそれがリストだったので私はデータに加わりました。私はそれを分割できるように文字列にする必要がありました。私はリストを分割できませんでした。しかし、私はそれらを間違って使っているのですか?それらを正しく使用する方法を教えていただけますか? – theprowler

+0

文字列は不変です。メソッドはそれらを他のものに変更するものではなく、それに基づいて新しい値を得ることしかできません。ですから 'lines = str1.splitlines()'と言うかもしれません。しかし、再び、参加して分割する理由は明確ではありません。あなたは値のリストを持っています。あなたは参加して分割することによって何を達成すると思いますか? –

答えて

1

私の推測では、あなたが捨てている表のセルの中に何らかのフォーマットが起こっていると思います。あなたのテーブルセルに表示4行が<br>タグで区切られたとすると、あなたがget_textを呼び出すとき、BeautifulSoupは、その情報を破棄します:

>>> s = 'First line <br />Second line <br />Third line' 
>>> soup = BeautifulSoup(s) 
>>> soup.get_text() 
u'First line Second line Third line' 

としては、あなたがあなたを作るかもしれない、改行のため<br>タグを入れ替えることができ、over hereを指摘人生がより容易:

>>> for br in soup.find_all("br"): 
...  br.replace_with("\n") 
>>> soup.get_text() 
u'First line \nSecond line \nThird line' 

strings and stripped_stringsジェネレータもここで便利です。

>>> soup = BeautifulSoup(s) 
>>> list(soup.stripped_strings) 
[u'First line', u'Second line', u'Third line'] 

だから、何があなたが行う場合はどうなります:彼らはもともと、タグで区切られたテキストのチャンクを返す

data['Available Quota'].extend(cols[1].stripped_strings) 

うまくいけば、あなたはdata['Available Quota']で探しているリストを持っている必要があります。

>>> data['Available Quota'] 
['GOM', 'CODGOM', 'HADDDABSGOM', 'YT'] 
+0

一見すると、あなたの修正は完全に動作するように見えます。しかし、私が最初に試したとき、私は 'AttributeError: 'ResultSet'というオブジェクトのエラーに遭遇しました。 'find_all'は' for br in cols.find_all( 'br'): '行を指しています。だから私はそのエラーが何だったのかを調べて、 '行内の行の直前に'編集してしまった。その行の直前でエラーを取り除いたが、次に 'KeyError:1'パスは存在しませんか? – theprowler

+0

ああ、私はあなたの答えを編集していないのを見ました。ごめんなさい。今すぐその方法を試してみます。 – theprowler

+0

それは働いた。私は文字通り、この1つの問題に一生懸命やってきました。あなたは一生懸命に解決しました。ありがとうございました。上記のようにコードを正確に入力してください。print(data ['Available Quota']) 'しかし、それは次のように出力されます: 「GOM CODGOM HADDDABSGOM YT」、「GOM COD」、「GOM HADD」、「DABS」、「GOM YT」」 私はそれの後半を望んでいます。最初の半分も印刷しますか? – theprowler

0

あなたの場合次のように交換してください:

0123その後、

str1 = '\n'.join(data['Available Quota']) 

として

str1 = ''.join(data['Available Quota']) 

コメントアウト:

GOM 
CODGOM 
HADDDABSGOM 
YT 

私が見るものの簡単な例:

str1.splitlines() 

は、その後、あなたのprint文は、次のプリントアウトされます'\ n' .join()の出力として

In [41]: b 
Out[41]: ['a', 'b', 'c'] 

In [42]: print('\n'.join(b)) 
a 
b 
c 
+0

は、私はそれを試してみました、それが再び失敗した:(それが再びプリントアウト: 'GOM CODGOM HADDDABSGOM YT' – theprowler

+0

あなたは、プリントアウトする –

+0

GOM CODGOM HADDDABSGOM YT を取得しようとしていますか? また、印刷するだけで何が表示されますか(data ['Available Quota']) –

関連する問題