是否有一种简单的方法将内容从<pre>标记获取到熊猫数据框?

时间:2019-09-28 02:16:37

标签: python html dataframe web-scraping pre

我试图将pre标签的内容传递给pandas数据框,但是我一直无法做到这一点,这是我到目前为止所要做的:

import requests,pandas
from bs4 import BeautifulSoup

#url

url='http://weather.uwyo.edu/cgi-bin/sounding?region=samer&TYPE=TEXT%3ALIST&YEAR=2019&MONTH=09&FROM=2712&TO=2712&STNM=80222'
peticion=requests.get(url)
soup=BeautifulSoup(peticion.content,"html.parser")

#get only the pre content I want

all=soup.select("pre")[0]

#write the content in a text file

with open('sound','w') as f:
    f.write(all.text)

#read it 
df = pandas.read_csv('sound')
df

我得到的是一个非结构化的数据帧,由于我必须使用几个URL来执行此操作,所以我宁愿直接在第12行之后传递数据,而无需编写文件。

this is the dataframe I get

1 个答案:

答案 0 :(得分:0)

这是固定宽度的文本,因此您需要通过在'\ n'上分割然后通过使用固定宽度值来生成行来生成行。您可以使用csv节省开销,但需要一个数据框。

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

r = requests.get('http://weather.uwyo.edu/cgi-bin/sounding?region=samer&TYPE=TEXT%3ALIST&YEAR=2019&MONTH=09&FROM=2712&TO=2712&STNM=80222')
soup = bs(r.content, 'lxml')
pre = soup.select_one('pre').text
results = []

for line in pre.split('\n')[1:-1]:
    if '--' not in line:
        row = [line[i:i+7].strip() for i in range(0, len(line), 7)]
        results.append(row)

df = pd.DataFrame(results)
print(df)