解析网页,这是所有tex

2024-06-17 14:59:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着解析一个纯文本文档的网页,它是用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)

但它并没有成功。它使它成为列表中的一个条目。你知道吗


Tags: no列表oshtmlbodypremediasoup
2条回答

你需要重新来做这个工作

在:

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

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)

相关问题 更多 >