2016-11-17 38 views
0

我想解析一個純文本文檔的網頁,它以HTML編碼,因此我嘗試使用BeautifulSoup來拉出文本並製作一個列表,但我無法做到。解析所有文本的網頁

<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> 

我感興趣的是:

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;;;;;;;; 

理想的情況下,構建一個數據幀,並保存爲CSV。

到目前爲止,我試過的東西,如:

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]) 

或一條線

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 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

你需要重新做這個工作

在:

import re 

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

出來:

['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']