2016-11-17 3 views
0

プレーンテキストのドキュメントであるWebページを解析しようとしていますが、HTMLでエンコードされているため、BeautifulSoupを使用してテキストを取り出してリストを作成しようとしました。すべてのテキストであるWebページの解析

<body> 
    <pre> 
    -------------------- 
    BDMEP - INMET 
    -------------------- 
    Estação   : PONTA PORA - MS (OMM: 83702) 
    Latitude (graus) : -22.55 
    Longitude (graus) : -55.71 
    Altitude (metros): 650.00 
    Estação Operante 
    Inicio de operação: 24/11/1941 
    Periodo solicitado dos dados: 01/01/2015 a 17/11/2016 
    Os dados listados abaixo são os que encontram-se digitados no BDMEP 
    Hora em UTC 
    -------------------- 
    Obs.: Os dados aparecem separados por ; (ponto e vírgula) no formato txt. 
    Para o formato planilha XLS, 
    <a href="instrucao.html" target="_top" rel="facebox">siga as instruções</a> 
    -------------------- 
Estacao;Data;Hora;Precipitacao;TempMaxima;TempMinima;Insolacao;Evaporacao Piche;Temp Comp Media;Umidade Relativa Media;Velocidade do Vento Media; 
83702;01/01/2015;0000;;;;;;;73.5;3.333333; 
83702;06/01/2016;1200;5;;;;;;;; 
83702;07/01/2016;0000;;;;;;;76.25;2.40072; 
83702;01/02/2016;1200;15.2;;;;;;;; 
    </pre>  
</body> 

私は、に興味がある:データフレームを構築し、CSVとして保存する

理想的
Piche;Temp Comp Media;Umidade Relativa Media;Velocidade do Vento Media; 
    83702;01/01/2015;0000;;;;;;;73.5;3.333333; 
    83702;06/01/2016;1200;5;;;;;;;; 
    83702;07/01/2016;0000;;;;;;;76.25;2.40072; 
    83702;01/02/2016;1200;15.2;;;;;;;; 

これまでのところ、私のようなものを試してみました:

soup = BeautifulSoup(a.content, 'html.parser') 
soup = soup.find_all('pre') 
text = [] 
for i in soup: 
    print(i) 
    text.append(i) 

しかし、それはトリックを行っていません。リスト内のすべてのエントリになります。

+3

それはとても分割 'のような標準的な' STRING'関数を使用するテキストです( '\ n ') '、または' [start_row:end_row] 'をスライスします。 BSはHTMLタグでのみ有効です。 – furas

+0

ああ、私は間違った方向に発砲したようだ。 –

+1

'私はプレーンテキスト文書であるウェブページを解析しようとしている。だから、あなたが望むのはテキスト解析ツールだ。テキストの解析はこの作業の大部分を占めるように見えます。もしあれば、実際にHTMLを解析することはほとんどありません。 'bs4'はHTML解析には最適ですが、それは実際にはこの仕事ではありません。 @furasはこれについて素晴らしい答えを出しました。それがあなたに役立ったならば、答えとしてそれを受け入れるようにしてください。 – sytech

答えて

2

BSは、HTMLタグのに便利ですが、あなたはほとんどsplit('\n')のような文字列関数を使用して[start_row:end_row]

あなたのHTMLテキスト

content = '''<body> 
    <pre> 
    -------------------- 
    BDMEP - INMET 
    -------------------- 
    Estação   : PONTA PORA - MS (OMM: 83702) 
    Latitude (graus) : -22.55 
    Longitude (graus) : -55.71 
    Altitude (metros): 650.00 
    Estação Operante 
    Inicio de operação: 24/11/1941 
    Periodo solicitado dos dados: 01/01/2015 a 17/11/2016 
    Os dados listados abaixo são os que encontram-se digitados no BDMEP 
    Hora em UTC 
    -------------------- 
    Obs.: Os dados aparecem separados por ; (ponto e vírgula) no formato txt. 
    Para o formato planilha XLS, 
    <a href="instrucao.html" target="_top" rel="facebox">siga as instruções</a> 
    -------------------- 
Estacao;Data;Hora;Precipitacao;TempMaxima;TempMinima;Insolacao;Evaporacao Piche;Temp Comp Media;Umidade Relativa Media;Velocidade do Vento Media; 
83702;01/01/2015;0000;;;;;;;73.5;3.333333; 
83702;06/01/2016;1200;5;;;;;;;; 
83702;07/01/2016;0000;;;;;;;76.25;2.40072; 
83702;01/02/2016;1200;15.2;;;;;;;; 
    </pre>  
</body>''' 

from bs4 import BeautifulSoup 

soup = BeautifulSoup(content, 'html.parser') 
text = soup.find('pre').text 
lines = text.split('\n') 
print(lines[-6:-1]) 

または1つのラインでスライスので、テキストてきました

print(content.split('\n')[-7:-2]) 

表が複数の行を持っているなら、あなたは、テーブルの開始

last = content.rfind(' --------------------') 
lines = content[last:].split('\n') 
print(lines[1:-2]) 

を見つけるために、そして今あなたがパンダのためのデータを作成するためにsplit(';')を使用して列に行を分割することができます:)

または使用を最後----------------を検索することができますio.StringIOは、メモリ内のファイルのようなオブジェクトを作成して使用するpd.read_csv()

import pandas as pd 
import io 

last = content.rfind(' --------------------') 

lines = content[last:].split('\n')[1:-2] 

# create one string with table 
text = '\n'.join(lines) 

# create file-like object with text 
fileobject = io.StringIO(text) 

# use file-like object with read_csv() 
df = pd.read_csv(fileobject, delimiter=';') 

print(df) 

または

アウト

import re 

re.findall(r'\w+;.+\n', string=html) 

:あなたは再でこの仕事

を行う必要があり

import pandas as pd 
import io 

start = content.rfind(' --------------------') 
start += len(' --------------------') 
end = content.rfind(' </pre>') 

text = content[start:end] 

fileobject = io.StringIO(text) 

df = pd.read_csv(fileobject, delimiter=';') 

print(df) 
0

['Estacao;Data;Hora;Precipitacao;TempMaxima;TempMinima;Insolacao;Evaporacao Piche;Temp Comp Media;Umidade Relativa Media;Velocidade do Vento Media;\n', 
'83702;01/01/2015;0000;;;;;;;73.5;3.333333;\n', 
'83702;06/01/2016;1200;5;;;;;;;;\n', 
'83702;07/01/2016;0000;;;;;;;76.25;2.40072;\n', 
'83702;01/02/2016;1200;15.2;;;;;;;;\n'] 
関連する問題