1

このウェブサイトhttp://app2.nea.gov.sg/anti-pollution-radiation-protection/air-pollution/psi/psi-readings-overから最新の気象 psi を示す太字のテキストを抽出したいと思います。 -最後の 24 時間。以下のこのコードを使用して抽出する方法を知っている人はいますか?

また、計算を行うために、現在の天気 psi の前にある 2 つの値を抽出する必要がありました。3 つの値の合計 (最新と前の 2 つの値)

例: 現在の値 (太字) は午前 5 時 : 51 です。午前 3 時と午前 4 時も必要です。誰かがこれを知っていて、私を助けることができますか? 前もって感謝します !

    from pprint import pprint
    import urllib2
    from bs4 import BeautifulSoup as soup


    url = "http://app2.nea.gov.sg/anti-pollution-radiation-protection/air-pollution/psi/psi-readings-over-the-last-24-hours"
    web_soup = soup(urllib2.urlopen(url))

    table = web_soup.find(name="div", attrs={'class': 'c1'}).find_all(name="div")[2].find_all('table')[0]

    table_rows = []
    for row in table.find_all('tr'):
        table_rows.append([td.text.strip() for td in row.find_all('td')])

    data = {}
    for tr_index, tr in enumerate(table_rows):
        if tr_index % 2 == 0:
            for td_index, td in enumerate(tr):
                data[td] = table_rows[tr_index + 1][td_index]

    pprint(data)

プリント:

    {'10AM': '49',
     '10PM': '-',
     '11AM': '52',
     '11PM': '-',
     '12AM': '76',
     '12PM': '54',
     '1AM': '70',
     '1PM': '59',
     '2AM': '64',
     '2PM': '65',
     '3AM': '59',
     '3PM': '72',
     '4AM': '54',
     '4PM': '79',
     '5AM': '51',
     '5PM': '82',
     '6AM': '48',
     '6PM': '79',
     '7AM': '47',
     '7PM': '-',
     '8AM': '47',
     '8PM': '-',
     '9AM': '47',
     '9PM': '-',
     'Time': '3-hr PSI'}
4

2 に答える 2

1

ここで何が起こっているかを必ず理解してください。

import urllib2
import datetime

from bs4 import BeautifulSoup as soup


url = "http://app2.nea.gov.sg/anti-pollution-radiation-protection/air-pollution/psi/psi-readings-over-the-last-24-hours"
web_soup = soup(urllib2.urlopen(url))

table = web_soup.find(name="div", attrs={'class': 'c1'}).find_all(name="div")[2].find_all('table')[0]

data = {}
bold_time = ''
cur_time = datetime.datetime.strptime("12AM", "%I%p")
for tr_index, tr in enumerate(table.find_all('tr')):
    if 'Time' in tr.text:
        continue
    for td_index, td in enumerate(tr.find_all('td')):
        if not td_index:
            continue
        data[cur_time] = td.text.strip()
        if td.find('strong'):
            bold_time = cur_time
        cur_time += datetime.timedelta(hours=1)

print data.get(bold_time)  # bold
print data.get(bold_time - datetime.timedelta(hours=1))  # before bold
print data.get(bold_time - datetime.timedelta(hours=2))  # before before bold

これにより3-hr PSI、太字でマークされた値とその前の 2 つの値 (存在する場合) が出力されます。

それが役立つことを願っています。

于 2013-06-24T18:19:33.060 に答える
0

このコード (#changedテキストのある行を参照)

from pprint import pprint
import urllib2
from bs4 import BeautifulSoup as soup


url = "http://app2.nea.gov.sg/anti-pollution-radiation-protection/air-pollution/psi/psi-readings-over-the-last-24-hours"
web_soup = soup(urllib2.urlopen(url))

table = web_soup.find(name="div", attrs={'class': 'c1'}).find_all(name="div")[2].find_all('table')[0]

table_rows = []
for row in table.find_all('tr'):
    table_rows.append([td.text.strip() for td in row.find_all('td')])

data = [] # changed
for tr_index, tr in enumerate(table_rows):
    if tr_index % 2 == 0:
        for td_index, td in enumerate(tr):
            data.append([td, table_rows[tr_index + 1][td_index]]) # changed

pprint(data)

あなたにあげる

[[u'Time', u'3-hr PSI'],
 [u'12AM', u'57'],
 [u'1AM', u'-'],
 [u'2AM', u'-'],
 [u'3AM', u'-'],
 [u'4AM', u'-'],
 [u'5AM', u'-'],
 [u'6AM', u'-'],
 [u'7AM', u'-'],
 [u'8AM', u'-'],
 [u'9AM', u'-'],
 [u'10AM', u'-'],
 [u'11AM', u'-'],
 [u'Time', u'3-hr PSI'],
 [u'12PM', u'-'],
 [u'1PM', u'-'],
 [u'2PM', u'-'],
 [u'3PM', u'-'],
 [u'4PM', u'-'],
 [u'5PM', u'-'],
 [u'6PM', u'-'],
 [u'7PM', u'-'],
 [u'8PM', u'-'],
 [u'9PM', u'-'],
 [u'10PM', u'-'],
 [u'11PM', u'-']]

そしてprint data[4:7]あなたに与える

[[u'3AM', u'-'], [u'4AM', u'-'], [u'5AM', u'-']]
于 2013-06-24T17:12:09.707 に答える