Использование Beautifulsoup для извлечения информации в pre, превращая ее в таблицу для CSV - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь извлечь текст с сайта, показанного ниже в коде.

Хотя я могу нормально распечатать список, я не могу превратить его в pandas фрейм данных и распечатать как csv.

Это сайт, который имеет только предварительная информация

Пожалуйста, дайте мне знать, если есть способ сделать это.

import requests 
from bs4 import BeautifulSoup



#url list for the new stations

url1="https://www.kyoshin.bosai.go.jp/cgi-bin/kyoshin/db/sitedat.cgi?1+NIG010+knet" 
tt1="C:/temp/"

page = requests.get(url1)

soup = BeautifulSoup(page.content, 'html.parser')

print(soup)

N-Value    P,S-Velocity   Density           Soil Column
                          (m/s)  (g/cm^3)
----------------------------------------------------------------------------------
  1m        13      1351    93      1.43          0m -      1m  Fl
  2m         9      1351   105      1.77          1m -   7.75m  S
  3m        11      1389   102      1.86       7.75m -  15.15m  S
  4m         7      1408   104      1.83      15.15m -  16.75m  S
  5m        20      1429   120      1.74      16.75m -   19.3m  SF
  6m        20      1481   121      1.89       19.3m -  22.75m  SF
  7m        24      1538   143      1.97      22.75m -   25.7m  M
  8m        53      1550   189      1.87       25.7m -  33.44m  S
  9m        52      1550   233      1.85                        
 10m        47      1504   222      1.93                        
 11m        43      1493   206       1.9                        
 12m        38      1504   222      1.89                        
 13m        27      1492   213      1.84                        
 14m        44      1492   213       1.9                        
 15m        62      1527   235      1.89                        
 16m        46      1504   189      1.92                        
 17m        22      1481   165      1.87                        
 18m        26      1471   147      1.86                        
 19m        24      1493   202      1.82                        
 20m        21      1493   198      1.87       

1 Ответ

0 голосов
/ 21 апреля 2020

Не самый надежный, но вы можете выполнять построчную итерацию для анализа нужных вам данных:

import requests 
import pandas as pd
from io import StringIO

#url list for the new stations

url1="https://www.kyoshin.bosai.go.jp/cgi-bin/kyoshin/db/sitedat.cgi?1+NIG010+knet" 
tt1="C:/temp/"

page = requests.get(url1)
s=str(page.content,'utf-8')

df = pd.DataFrame()

for lineNum, line in enumerate(s.splitlines()):
    if lineNum == 0:
        headers = line.split()
    elif lineNum == 1:
        unit1, unit2 = line.split()
    elif lineNum == 2:
        continue
    else:
        row = line.split()
        idx = row[0]
        nval = row[1]
        ps = row[2] + ' ' + row[3]
        den = row[4]
        try:
            soil = '%s %s %s' %(row[5], row[6], row[7])
            col = row[8]
        except Exception as e: 
            print(e)
            soil = ''
            col = ''

        temp_df = pd.DataFrame([[idx, nval, ps, den, soil, col]],
                               columns = ['Index',headers[0], headers[1] + ' ' + unit1, headers[2] + ' ' + unit2, headers[3], headers[4]])

        df = df.append(temp_df, sort=False).reset_index(drop=True)

df.to_csv('file.csv',index=False)

Вывод:

print (df)
   Index N-Value P,S-Velocity (m/s) Density (g/cm^3)             Soil Column
0     1m      13            1351 93             1.43          0m - 1m     Fl
1     2m       9           1351 105             1.77       1m - 7.75m      S
2     3m      11           1389 102             1.86   7.75m - 15.15m      S
3     4m       7           1408 104             1.83  15.15m - 16.75m      S
4     5m      20           1429 120             1.74   16.75m - 19.3m     SF
5     6m      20           1481 121             1.89   19.3m - 22.75m     SF
6     7m      24           1538 143             1.97   22.75m - 25.7m      M
7     8m      53           1550 189             1.87   25.7m - 33.44m      S
8     9m      52           1550 233             1.85                        
9    10m      47           1504 222             1.93                        
10   11m      43           1493 206              1.9                        
11   12m      38           1504 222             1.89                        
12   13m      27           1492 213             1.84                        
13   14m      44           1492 213              1.9                        
14   15m      62           1527 235             1.89                        
15   16m      46           1504 189             1.92                        
16   17m      22           1481 165             1.87                        
17   18m      26           1471 147             1.86                        
18   19m      24           1493 202             1.82                        
19   20m      21           1493 198             1.87           
...