Search code examples
pythonurllib2beautifulsoup

How do I extract data from unspaced strings?


I need to extract data from four strings that have been parsed in BeautifulSoup. They are:

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

The data from the first string, for example, is Arkansas, 72.1, 1:59 AM, 76.2, 9:04 AM, 5.2, 29, 77.3, and 7:59 AM. Is there a simple way to do this?

Edit: full code

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)

Solution

  • Just improve the way you extract the tabular data. I would use pandas.read_html() to read it into the dataframe which, I'm pretty sure, you would find convenient to work with:

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