2016-07-22 3 views
0

Как упоминалось в предыдущем вопросе, я использую Beautiful soup with python для извлечения метеорологических данных с веб-сайта.Beautifulsoup loop через HTML

Вот как сайт выглядит следующим образом:

<channel> 
<title>2 Hour Forecast</title> 
<source>Meteorological Services Singapore</source> 
<description>2 Hour Forecast</description> 
<item> 
<title>Nowcast Table</title> 
<category>Singapore Weather Conditions</category> 
<forecastIssue date="18-07-2016" time="03:30 PM"/> 
<validTime>3.30 pm to 5.30 pm</validTime> 
<weatherForecast> 
<area forecast="TL" lat="1.37500000" lon="103.83900000" name="Ang Mo Kio"/> 
<area forecast="SH" lat="1.32100000" lon="103.92400000" name="Bedok"/> 
<area forecast="TL" lat="1.35077200" lon="103.83900000" name="Bishan"/> 
<area forecast="CL" lat="1.30400000" lon="103.70100000" name="Boon Lay"/> 
<area forecast="CL" lat="1.35300000" lon="103.75400000" name="Bukit Batok"/> 
<area forecast="CL" lat="1.27700000" lon="103.81900000" name="Bukit Merah"/>` 
<channel> 

мне удалось получить дату forecastIssue & validTime. Тем не менее, я не могу получить разный прогноз области.

Вот мои питона коды:

import requests 
from bs4 import BeautifulSoup 
import urllib3 

outfile = open('C:\scripts\idk.xml','w') 

#getting the time 

r = requests.get('http://www.nea.gov.sg/api/WebAPI/? 
dataset=2hr_nowcast&keyref=<keyrefno>') 
soup = BeautifulSoup(r.content, "xml") 
time = soup.find('validTime').string 
print time 

#print issue date and time 
for currentdate in soup.findAll('item'): 
string = currentdate.find('forecastIssue') 
print string 

Это та часть, где я хочу, чтобы получить область прогноз, например. зональный прогноз = ш = «1,37500000» долгота = название «TL» «+103,83900000» = «Ang Mo Kio»/

for area in soup.findAll('weatherForecast'): 
areastring = area.find('area') 
print areastring 

Когда я бегу мои коды в питона, она только извлечет первую область, которая Ang Mo Kio выход

Пример:

2.30 pm to 5.30 pm 
<forecastIssue date="22-07-2016" time="02:30 PM"/> 
<area forecast="RA" lat="1.37500000" lon="103.83900000" name="Ang Mo Kio"/> 

Inspect element of the website

Как вы можете видеть, прогноз район находится в пределах div class

  1. Как проехать по всем областям? Я пробовал поиск в Интернете, но, по-видимому, считаю, что это не работает для моих кодов.

  2. Есть ли способ разделить дату и время?

  3. Есть ли способ проанализировать данные, полученные beautifulsoup, в XML-файл? Поскольку мой вывод не содержит никаких данных, когда я запускаю коды.

спасибо.

+0

Можете ли вы предоставить ссылку на ваш предыдущий вопрос? –

+0

http://stackoverflow.com/questions/38431446/beautifulsoup-returning-when-i-run-it – plzhelpmi

+0

Что касается пункта 3, вы делаете 0, записывая в 'outfile'. Естественно, он не содержит данных. –

ответ

2

Когда я запускаю мой коды в python, он только получил первую область, которая является Ang Mo Kio

findAll('weatherForecast') возвращает последовательность один элемента, заданную при условии XML. Затем переходите к повторению этой последовательности и используйте find('area'), который останавливается после нахождения 1 элемента и возвращает это, если оно есть.Для того, чтобы найти всю области элементов weatherForecast:

for area in soup.find('weatherForecast').find_all('area'): 
    print area 

Есть ли способ, чтобы разделить дату и время?

Не совсем уверен, что вы имеете в виду, может быть, вы хотите, чтобы извлечь значения из элемента:

for currentdate in soup.find_all('item'): 
    element = currentdate.find('forecastIssue') 
    print element['date'], element['time'] 
+0

Спасибо, это работает для меня! :) – plzhelpmi

1

1.To цикл через все районы,

areas = soup.select('area') 
for data in areas: 
    print(data.get('name')) 

Выход

Ang Mo Kio 
Bedok 
Bishan 
Boon Lay 
Bukit Batok 
Bukit Merah 

2.You могут индивидуально extact данные, а

date = soup.select('forecastissue')[0].get('date') 
time = soup.select('forecastissue')[0].get('time') 
+0

Он работает, спасибо! :) – plzhelpmi

Смежные вопросы