2016-06-28 16 views
1

BeautifulSoupで解析された4つの文字列からデータを抽出する必要があります。それらは:最初の文字列からスペースのない文字列からデータを抽出するにはどうすればよいですか?

Arkansas72.21:59 AM76.29:04 AM5.22977.37:59 AM 

Ashley71.93:39 AM78.78:59 AM0.53678.78:59 AM 

Bradley72.64:49 AM77.28:59 AM2.41877.28:49 AM 

Chicot-40.19:04 AM-40.19:04 AM2.573-40.112:09 AM 

データ、例えば、アーカンソー、72.1、1時59分AM、76.2、9時04分AM、5.2、29、77.3、及び7:59です。これを行う簡単な方法はありますか?

編集:完全なコード

import urllib2 
from bs4 import BeautifulSoup 
import time 

def scraper(): 

    #Arkansas State Plant Board Weather Web data 
    url1 = 'http://170.94.200.136/weather/Inversion.aspx' 

    #opens url and parses HTML into Unicode 
    page1 = urllib2.urlopen(url1) 
    soup1 = BeautifulSoup(page1, 'lxml') 

    #print(soup.get_text()) gives a single Unicode string of relevant data in strings from the url 
    #Without print(), returns everything in without proper spacing 
    sp1 = soup1.get_text() 

    #datasp1 is the chunk with the website data in it so the search for Arkansas doesn't return the header 
    #everything else finds locations for Unicode strings for first four stations 
    start1 = sp1.find('Today') 
    end1 = sp1.find('new Sys.') 
    datasp1 = sp1[start1:end1-10] 

    startArkansas = datasp1.find('Arkansas') 
    startAshley = datasp1.find('Ashley') 
    dataArkansas = datasp1[startArkansas:startAshley-2] 

    startBradley = datasp1.find('Bradley') 
    dataAshley = datasp1[startAshley:startBradley-2] 

    startChicot = datasp1.find('Chicot') 
    dataBradley = datasp1[startBradley:startChicot-2] 

    startCleveland = datasp1.find('Cleveland') 
    dataChicot = datasp1[startChicot:startCleveland-2] 


    print(dataArkansas) 
    print(dataAshley) 
    print(dataBradley) 
    print(dataChicot) 
+3

あなたも 'BeautifulSoup'特定の部分を表示することができますか?私は、HTMLからこのデータをどのように抽出したかに問題があると思われます。 – alecxe

+0

あなたは正規表現を行うことができます – Copperfield

+2

@Copperfield:真の正規表現は法案に適合します。しかし、私はalecxeがこれが[XY問題](http://www.perlmonks.org/?node=XY+Problem)だと考えるのは正しいと思います。 –

答えて

2

ちょうどあなたは表形式のデータを抽出する方法を改善します。私はあなたで動作するように便利見つけると思われる、私はかなり確信している、データフレームにそれを読むためにpandas.read_html()を使用します。

import pandas as pd 

df = pd.read_html("http://170.94.200.136/weather/Inversion.aspx", attrs={"id": "MainContent_GridView1"})[0] 
print(df) 
+0

テーブルの各値を独立変数として取得するにはどうすればよいですか? –

+0

@MichaelFisherええ、それ以前にパンダを使っていないのであれば、どうやって作業するかを研究してください。それはそれの価値がある。たとえば、次のようにさまざまな方法で繰り返し処理できます。http://stackoverflow.com/questions/16476924/how-to-iterate-over-rows-in-a-dataframe – alecxe

+1

これは私が以前やっていたより100倍も簡単です。私はパンダをもっと調べます。私はPythonにとってまったく新しいものです。 –

1

HTMLページを解析し、データを取得するためにbeautifulsoup使用する必要があります。

url1 = 'http://170.94.200.136/weather/Inversion.aspx' 

#opens url and parses HTML into Unicode 
page1 = urlopen(url1) 
soup1 = BeautifulSoup(page1) 

# get the table 
table = soup1.find(id='MainContent_GridView1') 

# find the headers 
headers = [h.get_text() for h in table.find_all('th')] 

# retrieve data 
data = {} 
tr_elems = table.find_all('tr') 
for tr in tr_elems: 
    tr_content = [td.get_text() for td in tr.find_all('td')] 
    if tr_content: 
     data[tr_content[0]] = dict(zip(headers[1:], tr_content[1:])) 

print(data) 

この例では、番組ます:

{ 
    "Greene West": { 
    "Low Temp (\u00b0F)": "67.7", 
    "Time Of High": "10:19 AM", 
    "Wind Speed (MPH)": "0.6", 
    "High Temp (\u00b0F)": "83.2", 
    "Wind Dir (\u00b0)": "20", 
    "Time Of Low": "6:04 AM", 
    "Current Time": "10:19 AM", 
    "Current Temp (\u00b0F)": "83.2" 
    }, 
    "Cleveland": { 
    "Low Temp (\u00b0F)": "70.8", 
    "Time Of High": "10:14 AM", 
    "Wind Speed (MPH)": "1.9", 
    [.....] 

} 
関連する問題